可观察收集的多个视图

时间:2012-03-13 14:41:04

标签: wpf vb.net filter observablecollection

我一直在研究这个问题,我显然错过了一些东西......

我创建,填充和绑定一个可观察的集合,如下所示:

    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

哪个好。我现在需要第二个列表框,其中包含该集合的过滤版本。过滤器函数使用WEI值= 1拉出元素。

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

问题是过滤器会影响两个列表框的内容。我想我需要一个特定的集合实例来应用过滤器或其他东西,但我不知所措!

感谢您的帮助。

1 个答案:

答案 0 :(得分: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