我正在使用MVVM模式的WPF桌面應用程序。CollectionViewSource上的觸發器過濾器
我想根據TextBox
中鍵入的文本過濾出ListView
中的一些項目。我希望ListView
項目在我更改文本時進行過濾。
我想知道如何在過濾器文本更改時觸發過濾器。
ListView
綁定到CollectionViewSource
,它綁定到我的ViewModel上的ObservableCollection
。過濾器文本的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"
鏈接到代碼中的事件處理程序的後面,這只是調用視圖模型的過濾方法。
時FilterText的值更改過濾完成 - 爲FilterText屬性的setter調用FilterList方法,用來在我的視圖模型的ObservableCollection
迭代,並且將在每個項目視圖模型一個boolean
FilteredOut屬性。
我知道FilteredOut屬性在過濾器文本更改時更新,但List不刷新。只有當我重新加載UserControl時,纔會觸發CollectionViewSource
篩選器事件,方法是切換它並返回。
我試過在更新過濾器信息後調用OnPropertyChanged("AllProjects")
,但它沒有解決我的問題。 (「AllProjects」是ObservableCollection
財產在我的ViewModel到了CollectionViewSource
綁定。)
我怎樣才能得到CollectionViewSource
來重新過濾本身時的FilterText TextBox
的值更改?
非常感謝
此外,有沒有辦法在我的ViewModel上直接調用過濾器方法('bool Include(object o)'),所以我不需要在代碼隱藏中有一個事件處理器? –