Я работаю над настольным приложением WPF, используя шаблон MVVM.
Я пытаюсь отфильтровать некоторые элементы из ListView
на основе текста, набранного в TextBox
. Я хочу, чтобы элементы ListView
были отфильтрованы, когда я изменяю текст.
Я хочу знать, как запускать фильтр при изменении текста фильтра.
ListView
привязывается к CollectionViewSource
, который привязывается к ObservableCollection
в моей ViewModel. TextBox
для текста фильтра привязывается к строке в ViewModel с UpdateSourceTrigger=PropertyChanged
, как и должно быть.
<CollectionViewSource x:Key="ProjectsCollection"
Source="{Binding Path=AllProjects}"
Filter="CollectionViewSource_Filter" />
<TextBox Text="{Binding Path=FilterText, UpdateSourceTrigger=PropertyChanged}" />
<ListView DataContext="{StaticResource ProjectsCollection}"
ItemsSource="{Binding}" />
Filter="CollectionViewSource_Filter"
ссылается на обработчик события в коде, который просто вызывает метод фильтра в ViewModel.
Фильтрация выполняется при изменении значения FilterText - средство настройки для свойства FilterText вызывает метод FilterList, который выполняет итерацию по ObservableCollection
в моей модели ViewModel и устанавливает свойство boolean
FilteredOut для каждого элемента ViewModel.
Я знаю, что свойство FilteredOut обновляется при изменении текста фильтра, но List не обновляется. Событие фильтра CollectionViewSource
запускается только при перезагрузке UserControl путем перехода от него и обратно.
Я попытался позвонить OnPropertyChanged("AllProjects")
после обновления информации о фильтре, но это не решило мою проблему.
( "AllProjects" - это свойство ObservableCollection
на моей модели ViewModel, с которой связывается CollectionViewSource
.)
Как я могу заставить CollectionViewSource
переделать себя, когда изменится значение FilterText TextBox
?
Большое спасибо