C# 具有相同itemsource和不同筛选器的ListView

C# 具有相同itemsource和不同筛选器的ListView,c#,wpf,listview,mvvm,filter,C#,Wpf,Listview,Mvvm,Filter,我有3个列表视图。itemsources绑定到ObservableCollection。person类具有integer属性(INotifyPropertyChanged为“teamID”)。现在,我想根据ListView所在的团队对其进行筛选,有没有简单的方法(我知道2种解决方案,但我认为它们并不好,1是进行3次ObservableCollection,但要跟踪并将所有人员转移到正确的ObservableCollection,这将很复杂,或者如果teamID是正确的teamID,则使用类似触发

我有3个列表视图。itemsources绑定到ObservableCollection。person类具有integer属性(INotifyPropertyChanged为“teamID”)。现在,我想根据ListView所在的团队对其进行筛选,有没有简单的方法(我知道2种解决方案,但我认为它们并不好,1是进行3次ObservableCollection,但要跟踪并将所有人员转移到正确的ObservableCollection,这将很复杂,或者如果teamID是正确的teamID,则使用类似触发器的可见性来显示^^) 我有3个按钮,如果我在任何列表视图中选择了一个项目(人员),则根据单击的按钮,该人员的teamID将更改。(但我也希望他根据teamID更改为正确的列表视图)


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

绑定到公共财产

  public List<person> SrtedPerson1 { get { return ListView.DataSource = OriginalList.Where(x => x.TeamId==filteringTeamId).ToList(); }} 
public List SrtedPerson1{get{return ListView.DataSource=OriginalList.Where(x=>x.TeamId==filteringTeamId.ToList();}}
更改按钮调用NotifyPropertyChanged(“SrtedPerson1”)

仅此一点并不能为您提供动态更新ListView.DataSource=OriginalList.Where(x=>x.TeamId==filteringTeamId),因为它只返回iEnumerable


在公共场合,我返回列表,就好像您只返回iEnumerable一样,它将被控件的列表包装起来

我认为不编写一些代码是不可能的

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

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

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

编辑:


我忘了告诉您,您必须将每个ListView上的源设置为相应的CollectionView,但我认为这是显而易见的。

我不知道我不太擅长这一点,但我是否应该使用observableCollections来代替,所以我不必调用NotifyPropertyChanged?这确实有效,但我不喜欢我必须调用NotifyPro在按钮事件上,它变得混乱,我更希望通过CollectionViewSource或其他方式得到答案,但是如果没有更好的答案,我会让你的答案是正确的。但是我会重写我的问题(因为它更高级,它不使用按钮而是拖放,所以很难跟踪在何处使用raisepropertychange事件)如果要有一个按钮和一个按钮事件,那么NotifyPropertyChanged只是一行代码不是一个可观察的集合。你说你想要一个按钮来进行更改。CollectionViewsSource更多地用于静态筛选。它是两行代码,因为我必须升级teamold和teamnew id。否则该人将在列表中出现两次哦,两行代码,对不起。它有效吗?我不知道升级了什么ade的意思是。我建议您发布您尝试过的代码。Oke稍后将研究如何将不同的视图与1个CollectionView一起使用,并将它们绑定到不同的ListView。