Множество видов наблюдаемой коллекции - PullRequest
4 голосов
/ 13 марта 2012

Я какое-то время работал над этой проблемой, и мне явно что-то не хватает ...

Я создаю, заполняю и связываю наблюдаемую коллекцию следующим образом:

    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

Проблема в том, что фильтр влияет на содержимое обоих списков. Я думаю, мне нужен определенный экземпляр коллекции, чтобы применить фильтр или что-то еще, но я в растерянности!

Спасибо за любую помощь.

1 Ответ

3 голосов
/ 13 марта 2012

Я думаю, что проблема в том, что вы привязываетесь к представлению по умолчанию, и когда вы изменяете это, вы изменяете представление для всего, что связано с той же коллекцией.Из документов для 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
...