两个listview绑定一个数据源,两个过滤器——第二个覆盖第一个.为什么

本文关键字:两个 第二个 覆盖 为什么 第一个 过滤器 数据源 绑定 listview 一个 | 更新日期: 2023-09-27 17:54:25

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

  1. 有两个listview

    <ListView x:Name="listView1"></ListView>
    <ListView x:Name="listView2"></ListView>
    
  2. 在代码后面为它们创建过滤器:

    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;
        }
    }
    
  3. 第二个过滤器覆盖第一个过滤器,以下项目显示在两个listViews中:

      1月
  4. 谁能告诉我,怎么了?我如何正确实例化绑定到一个数据源的两个listview,有两个不同的过滤器?

两个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

相关文章: