2013-01-19 32 views
1

我奋力的WPF问题可以概括如下:两个listView绑定一个数据源,两个过滤器 - 第二个覆盖第一个......为什么?

  1. 有两个列表视图

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

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

我将不胜感激任何帮助。

回答

0

他们指的是相同的视图对象。 MSDN

2

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

(注:未经检验的,但原则应该是声音)

+0

鲁迪嗨, 感谢快速回复。 有没有办法在ListView的视图级别上提供过滤? 只需要有几个listView作为透视数据,绑定到一个数据源 这可以通过CollectionViewSource方法处理吗? 非常感谢,Ondra –

+0

请看我更新的答案,你可以简单地实例化一个新的'CollectionViewSource',将'Source'设置为集合:) –

+0

@OndraDvorak感谢您的编辑。欢迎来到StackOverflow并在你的Q上+1完成:) –

相关问题