Фильтрация CollectionViewSource только в xaml

Мое текстовое поле предоставляет отфильтрованную строку в коллекцию, и когда я ввожу новое значение в текстовое поле, я хочу, чтобы моя коллекция обновлялась в соответствии с новым значением фильтра. Я хочу поместить логику фильтрации не в мою модель представления или код, а только в XAML. Код прилагается ниже. Сортировка и группировка работают нормально. Я проверил этот ответ: https://stackoverflow.com/a/6462282/5130106, он почти делает все но не хватает, когда дело доходит до обновления коллекции, поэтому я создаю новый вопрос, так как не могу найти ответ.

Есть ли способ добиться этого?

   <TreeView x:Name="SystemsTreeView" ItemsSource="{Binding Source={StaticResource SystemCollection}, Path=Groups}">

     <CollectionViewSource x:Key="SystemCollection" Source="{Binding SystemsList}" Filter="{MyLogic}">   
        <!--Sorting of Systems--> 
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="SystemName"/>
            <scm:SortDescription PropertyName="Version" Direction="Descending"/>
        </CollectionViewSource.SortDescriptions>
         <!--Grouping of Systems--> 
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="SystemName" />
        </CollectionViewSource.GroupDescriptions>                
    </CollectionViewSource>

person Smallestearth    schedule 12.03.2020    source источник
comment
Какой тип имеет список систем? и почему вы используете Source={StaticResource SystemCollection}?   -  person Rans    schedule 12.03.2020
comment
SystemsList — это observableCollection, и я использую staticResource, чтобы использовать источник представления коллекции для сортировки, группировки и, надеюсь, фильтрации, если это работает :)   -  person Smallestearth    schedule 12.03.2020


Ответы (1)


Я хочу поместить логику фильтрации не в мою модель представления или код, а только в XAML.

Невозможно. Вы не можете сделать это в чистом XAML. XAML — это язык разметки. Вы должны реализовать свою логику на языке программирования.

Учитывая вашу текущую настройку, вы должны вызывать Refresh() для CollectionViewSource всякий раз, когда изменяется TextBox, например, в обработчике событий TextChanged в коде программной части.

Если вы хотите обновить фильтр из модели представления, вы также должны выполнить реальную фильтрацию там. Например, вы можете открыть ICollectionView, к которому привязано представление. Нет смысла определять логику фильтрации в представлении, но попробуйте обновить ее из модели представления.

person mm8    schedule 13.03.2020