C# 两个ListView绑定了一个数据源,两个过滤器-第二个会覆盖第一个。。。为什么?
我正在努力解决WPF问题,可以这样概括:C# 两个ListView绑定了一个数据源,两个过滤器-第二个会覆盖第一个。。。为什么?,c#,wpf,C#,Wpf,我正在努力解决WPF问题,可以这样概括: 有两个列表视图 <ListView x:Name="listView1"></ListView> <ListView x:Name="listView2"></ListView> 在代码隐藏中,为其创建过滤器: var listViewCollection1 = (ListCollectionView)CollectionViewSource.GetDefaultView(Items); listVi
<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;
}
}
var listViewCollection1=(ListCollectionView)CollectionViewSource.GetDefaultView(项);
listViewCollection1.Filter=item=>(项作为字符串)。长度==5;
listView1.ItemsSource=listViewCollection1;
变量listViewCollection2=(ListCollectionView)CollectionViewSource.GetDefaultView(项);
listViewCollection2.Filter=item=>(项作为字符串)。长度==3;
listView2.ItemsSource=listViewCollection2;
公共ObservableCollection项=新ObservableCollection()
{
“约翰”,
“简”,
“兰尼”,
“卡罗尔”,
“拥抱”,
};
公共可观测收集项目
{
得到
{
退货项目;
}
专用设备
{
项目=价值;
}
}
- 一月
- 拥抱
非常感谢您的帮助。他们指的是同一个视图对象 两个
ListView
s本质上都绑定到同一集合的同一视图,您可以设置一次筛选器,然后覆盖它
记住,当你获取一个对象的引用时,你不是创建它的副本,而是引用它。仅仅因为引用的名称不同,并不意味着它不同
您可以通过运行调试器并断开第二个过滤器来发现这一点,您会注意到,在行运行之前,过滤器设置为长度为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;
(注意:未经测试,但原则应合理)你好,鲁迪,感谢您的快速回复。是否有方法仅在ListView的视图级别提供筛选?只需要将多个ListView作为数据的透视图,绑定到一个数据源,就可以通过CollectionViewSource方法处理吗?非常感谢,ondrap请查看我的更新答案,您只需实例化一个新的
CollectionViewSource
,将此集合的Source
添加到集合:)@ondravorak感谢您的编辑。欢迎使用StackOverflow和Q上的+1完成:)