【问题标题】:WPF binding to parent ItemsSource DataContext from DataTemplate itemWPF 从 DataTemplate 项绑定到父 ItemsSource DataContext
【发布时间】:2015-06-27 19:29:50
【问题描述】:

我有一个名为“A”的 ViewModel,包含 ObservableCollection(Of ChannelViewModel) 类型的属性。模型实际上在这个 ChannelViewModel 类中,我对此表示满意。

在视图“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

Channel UserControl 是(简化的):

<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

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

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

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

    我还必须将绑定更改为:

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

    【讨论】:

      猜你喜欢
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 2010-11-29
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 2014-07-30
      相关资源
      最近更新 更多