2016-09-15 3 views
1

Существует много дискуссий о фильтрации, группировании и сортировке на CollectionViewSource в WPF, а также то, что не является MVVM -практичным (особенно при добавлении фильтров в код).Связанный с XAML CollectionViewSource для ViewModel

Я хочу иметь ViewModel контроля над этими свойствами (например, добавление сортировки и фильтрация дескрипторы), но для того, чтобы использовать SynchronizationContext с асинхронным ObservableCollection, мне нужно CollectionViewSource инстанцированного в представлении (на диспетчерской нити), НЕ инстанцировано в модели - но модели требуется доступ к CollectionViewSource, чтобы добавить дескрипторы фильтра, группы и сортировки из кода, а не определять их в XAML. С этой целью я хотел бы найти способ привязать объект CollectionViewSource, объявленный XAML, к BACK в ViewModel. Что-то вроде этого:

<UserControl.Resources> 
    <CollectionViewSource 
     IsLiveFilteringRequested="True" 
     x:Name="collectionViewSource" 
     x:Key="collectionViewSource" 
     Source="{Binding DataContext.myCollection, IsAsync=True}" 
     Binding="{Binding DataContext.myCollectionViewSourceProperty, Mode=OneTime}" /> 
    </UserControl.Resources> 

Конечно, CollectionViewSource не имеет свойство «Binding», и источник должен указывать на ObservableCollection.

Есть ли способ сделать это?

ответ

1

Моя первоначальная мысль заключалась в том, чтобы оставить CollectionViewSource, определенный в - и созданном экземпляром - XAML, а затем использовать некоторую форму прикрепленного свойства для привязки фильтров, групп и свойств сортировки к значениям в модели представления. Конечно, это уже сделано (и, похоже, работает), как можно найти here.

Это должно решить вашу проблему, поскольку CollectionViewSource будет создан в потоке диспетчера, но может управляться из модели просмотра (гарантируя, что связанные изменения свойств также происходят в потоке диспетчера).

Смежные вопросы