使用筛选器将一个集合绑定到多个选项卡
本文关键字:绑定 集合 选项 一个 筛选 | 更新日期: 2023-09-27 17:48:50
在我的小型WPF项目中,我有一个带有三个选项卡的TabControl
。每个选项卡上都有一个ListBox
。这个项目跟踪我们需要购买的食品杂货。(不,这不是家庭作业,是给我妻子的。)所以我有一份ShoppingListItem
的清单,每一个都有Name
和Needed
属性:当我们需要物品时为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;
}
这里有几个想法:
- 加载"已购买"answers"需要"选项卡时,通过使用所需项目创建新集合来自行筛选它们,或者
- 加载选项卡"已购买"answers"需要"时,覆盖列表项数据绑定并基于"需要"切换可见性