两个listView绑定了一个dataSource,两个过滤器 - 第二个覆盖了第一个...为什么?

时间:2013-01-19 22:00:31

标签: c# wpf

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

  1. 有两个ListViews

    <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中:

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

  5. 我将不胜感激。

2 个答案:

答案 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