WPF 从 DataTemplate 项目绑定到父 ItemsSource DataContext

WPF binding to parent ItemsSource DataContext from DataTemplate item

我有一个名为 "A" 的 ViewModel,其中包含一个 属性 类型的 ObservableCollection(Of ChannelViewModel)。该模型实际上位于此 ChannelViewModel class 内,我对此表示满意。

在视图 "A" 中,我有一个堆栈面板,其中 ItemsSource 填充了 ObservableCollection。我添加了一个 DataTemplate 来显示自定义控件 "Channel" 而不是 ChannelViewModel 字符串。 Channel 自定义控件需要显示 ChannelViewModel 数据。

问题是 Channel 的 DataContext 没有正确连接到列表的每个项目。我尝试了很多东西,但似乎没有任何效果。请提供帮助!

这里是"A"查看代码:

<Window.DataContext>
    <ctrls:AViewModel/>
</Window.DataContext>
<StackPanel x:Name="uiStack" Orientation="Horizontal">
    <ItemsControl ItemsSource="{Binding Channels}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                 <ctrls:Channel DataContext="{Binding DataContext}"  />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                 <WrapPanel/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>                
    </ItemsControl>            
</StackPanel>

这里是 "A" 视图模型:

Private aChannels As New ObservableCollection(Of ChannelViewModel)
Property Channels As ObservableCollection(Of ChannelViewModel)
    Get
        Return aChannels
    End Get
    Set(value As ObservableCollection(Of ChannelViewModel))
        aChannels = value
        OnPropertyChanged("Channels")
    End Set
End Property

Public Sub New()
    AddChannels()
    OnPropertyChanged("Channels")
End Sub

Private Sub AddChannels()
    For i As Integer = 1 To DeviceConfig.Channels.Count
        Channels.Add(New ChannelViewModel(i)) 
    Next        
End Sub

频道用户控件是(简化):

<UserControl.DataContext>
    <ctrls:ChannelViewModel />
</UserControl.DataContext>
<StackPanel Orientation="Horizontal">
    <Label x:Name="lblChannelNo" Content="{Binding ChannelNo}" />
    <Label x:Name="lblChannelName" Content="{Binding ChannelName}" />
</StackPanel>

和 Channel ViewModel(简化):

Public Class ChannelViewModel
    Inherits ViewModelBase

    Private aChannelNo As Integer = 0
    Property ChannelNo As Integer
        Get
            Return aChannelNo
        End Get
        Set(value As Integer)
            aChannelNo = value
            OnPropertyChanged("ChannelNo")
        End Set
    End Property

    Private aChannelName As String = "N/A"
    Property ChannelName As String
        Get
            Return aChannelName
        End Get
        Set(value As String)
            aChannelName = value
            OnPropertyChanged("ChannelName")
        End Set
    End Property

好的,问题出在频道视图中。我认为设置 DataContext 会覆盖 "A" 视图中的上下文。所以删除这些行解决了这个问题:

<UserControl.DataContext>
    <ctrls:ChannelViewModel />
</UserControl.DataContext>

我还必须将绑定更改为:

<DataTemplate>
    <ctrls:Channel DataContext="{Binding}"  />
</DataTemplate>