2012-03-13 282 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