我正在努力解决WPF问题,这个问题可以概括为:
-
有两个listview
<ListView x:Name="listView1"></ListView> <ListView x:Name="listView2"></ListView>
-
在代码后面为它们创建过滤器:
var listViewCollection1 = (ListCollectionView)CollectionViewSource.GetDefaultView(Items); listViewCollection1.Filter = item => (item as string).Length == 5; listView1.ItemsSource = listViewCollection1; var listViewCollection2 = (ListCollectionView)CollectionViewSource.GetDefaultView(Items); listViewCollection2.Filter = item => (item as string).Length == 3; listView2.ItemsSource = listViewCollection2; public ObservableCollection<string> items = new ObservableCollection<string>() { "John", "Jan", "Lanny", "Carol", "Hug", }; public ObservableCollection<string> Items { get { return items; } private set { items = value; } }
-
第二个过滤器覆盖第一个过滤器,以下项目显示在两个listViews中:
- 1月
-
谁能告诉我,怎么了?我如何正确实例化绑定到一个数据源的两个listview,有两个不同的过滤器?
两个ListView
基本上都绑定到同一集合的相同视图,您设置一次过滤器,然后覆盖它。
记住,当你获取一个对象的引用时,你不是创建一个副本,而是引用。仅仅因为引用的命名不同,并不会使它不同。
您可以通过运行调试器并打破第二个过滤器来发现这一点,您将注意到在行运行之前,过滤器被设置为长度为5的lambda过滤器,然后您将更改为长度为3。
要实现您想要的,您需要创建另一个CollectionViewSource
,并将Source
设置为原始列表。
var listViewCollection1 = (ListCollectionView)CollectionViewSource.GetDefaultView(Items);
listViewCollection1.Filter = item => (item as string).Length == 5;
listView1.ItemsSource = listViewCollection1;
var newView = new CollectionViewSource() { Source = Items };
var listViewCollection2 = (ListCollectionView)newView.View; // Here the View must be used
listViewCollection2.Filter = item => (item as string).Length == 3;
listView2.ItemsSource = listViewCollection2;
(注意:未经测试,但原则应该是合理的)
它们引用同一个视图对象。MSDN