2013-01-19 47 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完成:) –

相關問題