C# 使用筛选器将一个集合绑定到多个选项卡

C# 使用筛选器将一个集合绑定到多个选项卡,c#,wpf,vb.net,data-binding,.net-3.5,C#,Wpf,Vb.net,Data Binding,.net 3.5,在我的小WPF项目中,我有一个带有三个选项卡的TabControl。每个选项卡上都有一个列表框。这个项目跟踪我们需要购买的食品杂货。(不,这不是家庭作业,是给我妻子的。)所以我有一个ShoppingListItems的列表,每个列表都有一个名称和一个所需的属性:true当我们需要物品时,以及false 因此,这三个标签是全部、购买和需要的。它们都应该指向相同的ShoppingListItemCollection(继承自ObservableCollection)。但是买的东西应该只显示需要的东西是

在我的小WPF项目中,我有一个带有三个选项卡的
TabControl
。每个选项卡上都有一个
列表框
。这个项目跟踪我们需要购买的食品杂货。(不,这不是家庭作业,是给我妻子的。)所以我有一个
ShoppingListItem
s的列表,每个列表都有一个
名称和一个
所需的
属性:
true
当我们需要物品时,以及
false

因此,这三个标签是全部、购买和需要的。它们都应该指向相同的
ShoppingListItemCollection
(继承自
ObservableCollection
)。但是买的东西应该只显示需要的东西是假的,需要的东西应该只显示需要的东西是真的。(所有选项卡上的项目都有复选框。)

这似乎并不难,但几个小时后,我还没想明白。我需要的似乎是CollectionView或CollectionViewSource,但我无法让任何事情发生;我勾选和取消勾选“所有”选项卡上的复选框,其他两个选项卡上的项目就在那里盯着我看


有什么想法吗?

以下是一些想法:

  • 当您购买并需要加载标签时,可以通过创建包含所需项目的新集合来自己筛选标签,或者
  • 加载选项卡时,覆盖列表项databind并根据需要切换可见性
  • 您可以使用过滤器重用原始集合

    <Window.Resources>
        <CollectionViewSource x:Key="NeededItems" Source="{Binding Items}" Filter="NeededCollectionViewSource_Filter" />
        <CollectionViewSource x:Key="BoughtItems" Source="{Binding Items}" Filter="BoughtCollectionViewSource_Filter" />
    </Window.Resources>
    
    <TabControl>
        <TabItem Header="All">
            <ListBox DisplayMemberPath="Name" ItemsSource="{Binding Items}" />
        </TabItem>
        <TabItem Header="Bought">
            <ListBox DisplayMemberPath="Name" ItemsSource="{Binding Source={StaticResource BoughtItems}}" />
        </TabItem>
        <TabItem Header="Needed">
            <ListBox DisplayMemberPath="Name" ItemsSource="{Binding Source={StaticResource NeededItems}}" />
        </TabItem>
    </TabControl>
    

    我发现在WPF中,有5000种方法可以进行数据绑定。不幸的是,其中只有大约3个是正确的。另外4997给出了无法理解的错误。
    private void NeededCollectionViewSource_Filter(object sender, FilterEventArgs e)
    {
        e.Accepted = ((ShoppingListItem) e.Item).Needed;
    }
    
    private void BoughtCollectionViewSource_Filter(object sender, FilterEventArgs e)
    {
        e.Accepted = !((ShoppingListItem) e.Item).Needed;
    }