观察集合
问题描述:
我一直对这个问题有一段时间,我清楚地失去了一些东西的多个视图...观察集合
我创建,填充和绑定一个观察的集合,像这样:
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
问题是过滤器会影响两个列表框的内容。我想我需要一个特定的集合实例来应用过滤器或者其他东西,但是我很茫然!
感谢您的任何帮助。
答
我认为问题在于你绑定了默认视图,并且当你改变它的时候,你改变了绑定到同一个集合的所有东西的视图。来自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
这正是我所需要的!非常感谢 – qu1ckdry 2012-03-13 16:11:03
非常欢迎。 – 2012-03-13 18:58:10