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