Множество видов наблюдаемой коллекции

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

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

    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 ответ

Решение

Я думаю, что проблема в том, что вы привязываетесь к представлению по умолчанию, и когда вы изменяете это, вы изменяете представление для всего, что связано с той же коллекцией. Из документов для CollectionViewSource.GetDefaultView:

Все коллекции имеют коллекцию по умолчанию. 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
Другие вопросы по тегам