如何在WPF中绑定相关表?

时间:2017-01-07 10:41:43

标签: c# wpf xaml data-binding dataset

我有两个表,optionsitems。一个项目与多个选项相关联。

table relationship image

我想在嵌套的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>

2 个答案:

答案 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,如图所示。