2015-04-20 3 views
0

У меня есть ViewModel с именем «A», содержащее свойство типа ObservableCollection (Of ChannelViewModel). Модель действительно находится внутри этого класса ChannelViewModel, и я в порядке с этим.WPF привязка к parent ItemsSource DataContext из элемента DataTemplate

В представлении «A» у меня есть стекная панель с ItemsSource, заполненная ObservableCollection. Я добавил DataTemplate для отображения настраиваемого элемента управления «Канал» вместо строки ChannelViewModel. Пользовательский контроль канала должен отображать данные ChannelViewModel.

Проблема заключается в том, что 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> 

Вот "А" ViewModel:

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 есть (упрощенно):

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

И Канал 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 

ответ

1

Хорошо, проблема была в просмотре канала. Я думаю, что установка DataContext переписывала контекст из представления «A». Поэтому удаление этих строк решается вопрос:

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

Я также должен был изменить связывание:

<DataTemplate> 
    <ctrls:Channel DataContext="{Binding}" /> 
</DataTemplate> 
Смежные вопросы