2

我正在努力解决可以这样概括的 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. 第二个过滤器覆盖第一个过滤器,以下项目显示在两个列表视图中:

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

我将不胜感激任何帮助。

4

2 回答 2

3

两个ListViews 本质上都绑定到同一个集合的同一个视图,你设置一次过滤器然后覆盖它。

请记住,当您获得对对象的引用时,您不会创建它的副本,而是引用它。仅仅因为该引用的名称不同并不会使其不同。

您可以通过运行调试器并中断第二个过滤器来发现这一点,您会注意到在该行运行之前,过滤器设置为长度为 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;

(注:未经测试,但原理应该是健全的)

于 2013-01-19T22:08:46.157 回答
0

它们指的是同一个视图对象。MSDN

于 2013-01-19T22:08:35.567 回答