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>
我有一个名为 "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>