我正在努力解决WPF问题,可以像这样概括:
有两个ListViews
<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中:
谁能告诉我,怎么了?如何正确实例化绑定到一个数据源的两个listView,具有两个不同的过滤器?
我将不胜感激。
答案 0 :(得分:2)
两个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;
(注意:未经测试,但原则应该是合理的)
答案 1 :(得分:0)
它们指的是同一个视图对象。 MSDN