具有相同itemsource的列表视图不同的过滤器

时间:2012-03-25 19:52:36

标签: c# wpf listview mvvm filter

我有3个listviews。 itemsources绑定到ObservableCollection,person类具有整数属性(使用INotifyPropertyChanged)“teamID”。现在我想根据他们所在的团队过滤列表视图,有没有办法轻松完成(我知道2个解决方案,但我认为它们不好,1是制作3 ObservableCollection但是这对于保持跟踪并将所有人员转移到正确的ObservableCollection,或者如果teamID是正确的teamID ^^,则使用类似可见性的触发器^^) 我有3个按钮,如果我在任何列表视图中选择一个项目(人物),根据点击的按钮,该人员队伍ID将会改变。 (但我也希望他根据teamID更改为正确的列表视图)

希望您理解,否则请随时询问更多细节。

2 个答案:

答案 0 :(得分:2)

我认为如果不编写一些代码就无法做到。

我会使用CollectionView而不是将集合直接绑定到ListView。这就是WPF在内部所做的事情,但是由你自己创建它们可以控制许多事情,比如排序和过滤器。

使用CollectionViewSource.GetDefaultView(yourCollection)创建它们。

应用过滤器并在您的团队ID属性的setter上,当团队ID更改时,请执行CollectionView.Refresh()。如果您没有太多数据,这不是一个大问题。但是在三个视图上的大量数据Refresh()可能有点重。

编辑:

我忘了告诉你必须将每个ListView上的源设置为相应的CollectionView,但我认为这很明显。

答案 1 :(得分:0)

绑定公共财产

  public List<person> SrtedPerson1 { get { return ListView.DataSource = OriginalList.Where(x => x.TeamId==filteringTeamId).ToList(); }} 

让Button调用NotifyPropertyChanged(“SrtedPerson1”);

仅此一项不会为您提供动态更新ListView.DataSource = OriginalList.Where(x =&gt; x.TeamId == filteringTeamId),因为它仅返回iEnumerable。

在公开场合,我返回List,就好像你只是返回iEnumerable一样,无论如何它都将被包装为控件