2017-01-07 6 views
0

У меня есть две таблицы, options и items. Один элемент связан с несколькими параметрами.Как связать связанную таблицу в WPF?

table relationship image

Я хочу, чтобы отобразить элементы и их параметры в вложенных ListBox с. Проблема в том, что внутренние ListBox s не отображают вещи. Я думаю, может быть, я не привязал ItemsSource правильно. Как связать его? не

Моя попытка ниже:

<Window.Resources> 
    <local:TaxAccessmentDataSet x:Key="taxAccessmentDataSet"/> 
    <CollectionViewSource x:Key="itemsViewSource" Source="{Binding items, Source={StaticResource taxAccessmentDataSet}}"/> 
    <CollectionViewSource x:Key="itemsoptionsViewSource" Source="{Binding FK_options_items, Source={StaticResource itemsViewSource}}"/> 
</Window.Resources> 
<ListBox x:Name="listBox"ItemsSource="{Binding}" DataContext="{StaticResource itemsViewSource}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Expander x:Name="expander" Header="{Binding name}"> 
       <ListBox ItemsSource="{Binding}" DataContext="{StaticResource itemsoptionsViewSource}" DisplayMemberPath="name"> 
       </ListBox> 
      </Expander> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

ответ

2

DataContext внутреннего ListBox будет DataRowView, который представляет элемент. Чтобы вы могли использовать привязку данных для отображения соответствующих параметров этого элемента, элемент должен выставить общедоступное свойство, которое возвращает коллекцию этих параметров. Класс DataRowView не делает так, что вы не можете сделать это в чистом XAML.

Но вы могли бы справиться с Loaded событие ListBox и создать DataView для опций себя:

<ListBox x:Name="listBox" ItemsSource="{Binding}" DataContext="{StaticResource itemsViewSource}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Expander x:Name="expander" Header="{Binding name}"> 
       <ListBox DisplayMemberPath="name" Loaded="ListBox_Loaded" /> 
      </Expander> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

private void ListBox_Loaded(object sender, RoutedEventArgs e) 
{ 
    ListBox inner = sender as ListBox; 
    if (inner != null) 
    { 
     DataRowView drv = inner.DataContext as DataRowView; 
     if (drv != null) 
     { 
      DataView childView = drv.CreateChildView(drv.DataView.Table.ChildRelations[0]); 
      //or drv.CreateChildView(drv.DataView.Table.ChildRelations["FK_options_items"]); 
      inner.ItemsSource = childView; 
     } 
    } 
} 
+0

Я пробовал это, и он не работал. Я обнаружил, что 'childView' пуст, и' childView.Table', который является 'optionsDataTable', также пуст. Но таблица 'options' имеет данные. –

+0

Вам нужно объяснить (разместить), как ваши отношения данных будут настроены тогда. Разумеется, вам нужно будет установить правильное соотношение между вашими таблицами, чтобы это работало. Проверьте пример в MSDN: https://msdn.microsoft.com/en-us/library/system.data.datatable.childrelations(v=vs.110).aspx – mm8

+0

Я только что использовал 'optionsTableAdapter' для' Заполните() 'таблицу' options'. Теперь у него есть данные, но 'childView' по-прежнему пуст. –

0

DataContext из пункта больше не родитель - это уже ваш деталь. Таким образом, вы должны изменить

<ListBox ItemsSource="{Binding}" DataContext="{StaticResource itemsoptionsViewSource}" DisplayMemberPath="name"> 

в

<ListBox ItemsSource="{Binding items}" DisplayMemberPath="name"> 

Это связывает пункты вложенного ListBox свойству items в качестве option, как показано на диаграмме.

+0

Это не будет работать так как DataRowView не имеет государственной собственности под названием «элементы» что вы пытаетесь связать ... – mm8

+0

Да. Я попробовал это сейчас. это не сработало. –