2012-03-13 328 views
4

我一直對這個問題有一段時間,我清楚地失去了一些東西的多個視圖...觀察集合

我創建,填充和綁定一個觀察的集合,像這樣:

Dim _ObservableWEI As New ObservableWEI 
... 
    _ObservableWEI.Add(New WEI() With {.WEInum = 1, .WEIvalue = 1}) 
    _ObservableWEI.Add(New WEI() With {.WEInum = 2, .WEIvalue = 0}) 
    _ObservableWEI.Add(New WEI() With {.WEInum = 3, .WEIvalue = 2}) 
... 
    lbxAll.ItemsSource = _ObservableWEI 

這很好。我現在需要第二個包含收集過濾版本的列表框。過濾器函數拉出WEIvalue = 1的元素。

Dim view As ListCollectionView 
... 
    view = CType(CollectionViewSource.GetDefaultView(_ObservableWEI), ListCollectionView) 
    view.Filter = New Predicate(Of Object)(AddressOf ListFilter) 
... 
    lbxView.ItemsSource = view 

問題是過濾器會影響兩個列表框的內容。我想我需要一個特定的集合實例來應用過濾器或者其他東西,但是我很茫然!

感謝您的任何幫助。

回答

3

我認爲問題在於你綁定了默認視圖,並且當你改變它的時候,你改變了綁定到同一個集合的所有東西的視圖。來自docs for CollectionViewSource.GetDefaultView

所有集合都有一個默認的CollectionView。 WPF始終綁定到一個視圖,而不是一個集合。如果直接綁定到集合,WPF實際上會綁定到該集合的默認視圖。此默認視圖由​​集合的所有綁定共享,這會導致與集合的所有直接綁定共享一個默認視圖的排序,過濾器,組和當前項目特性。

Collection和CollectionView的設計模式是你有一個集合,但有多個視圖。所以我認爲你需要做的是製作兩個不同的集合視圖對象:

Dim view1 As new ListCollectionView(_ObservableWEI) 
'set filtering, grouping, etc. 

'bind to it 
lbxAll.ItemsSource = view1 

Dim view2 As new ListCollectionView(_ObservableWEI) 
'set filtering, grouping, etc. 

'bind to it 
lbxView.ItemsSource = view2 
+0

這正是我所需要的!非常感謝 – qu1ckdry 2012-03-13 16:11:03

+0

非常歡迎。 – 2012-03-13 18:58:10