2013-08-02 5 views
3

У меня есть классСвязывание вложенных данных

public class MyData 
{ 
    public string Caption { get; set; } 
    public List<Data1> ListData1 {get; set;} 
} 

public class Data1 
{ 
    public string FirstName { get; set; } 
    public List<Data2> ListData2 { get; set; } 
} 

public class Data2 
{ 
    public string LastName { get; set; } 
} 

данные должны быть отображены в виде

enter image description here

Я делаю так - чтобы связать MyData ListBox заполненный данными. Для него, указывая DataTemplate, довести код

  <!-- MyData --> 
      <Grid Grid.Column="0"> 

       <Grid.RowDefinitions> 
        <RowDefinition /> 
       </Grid.RowDefinitions> 

       <TextBlock Grid.Row="0" Text="{Binding Caption}" /> 

      </Grid> 

      <!-- Data1 --> 
      <ListBox 
        Grid.Column="1" 
        DisplayMemberPath = "FirstName" 
        ItemsSource="{Binding ListData1 }" /> 
      <!-- -->   

      <!-- Data2 --> 
      <ListBox x:Name="lbData2" 
        Grid.Column="2" 
        DisplayMemberPath = "LastName" 
        ItemsSource="{Binding ????}" /> 

     </Grid> 
    </DataTemplate> 

Как сделать Binding для lbData2? Параметр ListData1.ListData2 не работает.

+0

Пожалуйста, просмотрите этот [вопрос] (http://stackoverflow.com/questions/10919262/populate-wpf-listbox-based-on-selection-of-another-listbox) (и его ответ). Я думаю, что это может вам помочь. – HuorSwords

+0

Вы проверили HierarchicalDataTemplate: http://msdn.microsoft.com/de-de/library/system.windows.hierarchicaldatatemplate.aspx ?? – blindmeis

ответ

1

Я считаю, что вы можете просто использовать следующий синтаксис связывания:

ItemsSource="{Binding ListData1/ListData2}" 

Это означает привязку к ListData2 свойству текущего или выбранного экземпляра ListData1.

Подробнее вы можете узнать на странице Binding.Path Property в MSDN.

+0

Спасибо, что это работает – FetFrumos

1

Если вы не хотите ничего менять в ViewModel, вы можете сделать это на языке XAML только:

<!-- Data1 --> 
     <ListBox x:Name="firstNamelbx" 
       Grid.Column="1" 
       DisplayMemberPath = "FirstName" 
       ItemsSource="{Binding ListData1 }" /> 
     <!-- -->   

     <!-- Data2 --> 
     <ListBox x:Name="lbData2" Grid.Column="2" 
       DataContext="{Binding Path=SelectedItem, ElementName=firstNamelbx}" 
       DisplayMemberPath = "LastName" 
       ItemsSource="{Binding ListData2}" /> 

Я думаю, что лучший способ либо добавить свойство SelectedFirstName в модели представления и связать его с первым выбранный элемент списка списка имен или используйте ICollectionView вместо списка и синхронизируйте его CurrentItem с полем списка имен.

+0

Спасибо, что это работает, но мне нужен CurrentItem, а не SelectedItem – FetFrumos

+0

Я вернулся к этой проблеме. Связывание - это работа (Binding ListData1/ListData2). Теперь мне нужно сделать выравнивание строк по высоте. Есть идеи? – FetFrumos

+0

@FetFrumos, можете ли вы описать более подробно? Как вы хотите выровнять два списка? –

Смежные вопросы