Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 两个ListView绑定了一个数据源,两个过滤器-第二个会覆盖第一个。。。为什么?_C#_Wpf - Fatal编程技术网

C# 两个ListView绑定了一个数据源,两个过滤器-第二个会覆盖第一个。。。为什么?

C# 两个ListView绑定了一个数据源,两个过滤器-第二个会覆盖第一个。。。为什么?,c#,wpf,C#,Wpf,我正在努力解决WPF问题,可以这样概括: 有两个列表视图 <ListView x:Name="listView1"></ListView> <ListView x:Name="listView2"></ListView> 在代码隐藏中,为其创建过滤器: var listViewCollection1 = (ListCollectionView)CollectionViewSource.GetDefaultView(Items); listVi

我正在努力解决WPF问题,可以这样概括:

  • 有两个列表视图

    <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,使用两个不同的过滤器


  • 非常感谢您的帮助。

    他们指的是同一个视图对象

    两个
    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完成:)