我有两个表,options
和items
。一个项目与多个选项相关联。
我想在嵌套的ListBox
中显示项目及其选项。问题是内部ListBox
不显示内容。我想也许我没有正确绑定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>
答案 0 :(得分:2)
内部ListBox的DataContext将是一个表示项目的DataRowView。为了能够使用数据绑定来显示此项的相应选项,该项必须公开一个返回这些选项集合的公共属性。 DataRowView类不是这样,你不能在纯XAML中执行此操作。
但是你可以处理ListBox的Loaded事件并自己为这些选项创建一个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;
}
}
}
答案 1 :(得分:0)
项目的DataContext
不再是父项 - 它已经是您的项目了。所以你必须改变
<ListBox ItemsSource="{Binding}" DataContext="{StaticResource itemsoptionsViewSource}" DisplayMemberPath="name">
到
<ListBox ItemsSource="{Binding items}" DisplayMemberPath="name">
这会将嵌套ListBox
的项目绑定到items
的属性option
,如图所示。