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

本文关键字:绑定 集合 选项 一个 筛选 | 更新日期: 2023-09-27 17:48:50

在我的小型WPF项目中,我有一个带有三个选项卡的TabControl。每个选项卡上都有一个ListBox。这个项目跟踪我们需要购买的食品杂货。(不,这不是家庭作业,是给我妻子的。)所以我有一份ShoppingListItem的清单,每一个都有NameNeeded属性:当我们需要物品时为true,购买后为false

因此,这三个选项卡分别为"全部"、"已购买"answers"需要"。它们都应该指向相同的ShoppingListItemCollection(继承自ObservableCollection<ShoppingListItem>)。但是Bought应该只显示Needed为false的项目,而Needed应该只显示Needed为true的项目。(所有选项卡上的项目都有复选框。)

这似乎并不难,但几个小时后,我就不想弄清楚了。我似乎需要CollectionView或CollectionViewSource,但我什么都做不了;我选中并取消选中所有选项卡上的复选框,其他两个选项卡上的项目就坐在那里盯着我看。

有什么想法吗?

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

您可以使用CollectionViewSource使用过滤器重新使用原始集合。

<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>

过滤器需要一些代码隐藏。

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;
}

这里有几个想法:

  1. 加载"已购买"answers"需要"选项卡时,通过使用所需项目创建新集合来自行筛选它们,或者
  2. 加载选项卡"已购买"answers"需要"时,覆盖列表项数据绑定并基于"需要"切换可见性