想法是,我有一个文本框,在其中键入一个字符串,该字符串将过滤collectionviewsource,它是一个树视图。附上下面的代码:
排序和分组工作正常。
View.xaml
<TreeView x:Name="SystemsTreeView" ItemsSource="{Binding Source={StaticResource SystemCollection}, Path=Groups}">
<CollectionViewSource x:Key="SystemCollection" Source="{Binding SystemsList}" Filter="SystemCollectionChangeFilter" IsLiveFilteringRequested="True" >
<CollectionViewSource.LiveFilteringProperties>
<clr:String>SystemName</clr:String>
<clr:String>Version</clr:String>
</CollectionViewSource.LiveFilteringProperties>
<!--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>
SystemCollectionChangeFilter调用视图模型上的方法进行过滤。
ViewModel
ICollectionView viewSource = CollectionViewSource.GetDefaultView(SystemsList); //in the constructor
private string _systemNameFilter;
public string SystemNameFilter //Attached to Textbox (for filtering)
{
get { return _systemNameFilter; }
set
{
if (_systemNameFilter != value)
{
_systemNameFilter = value;
viewSource.Refresh(); //This is not triggering the filtering event.
NotifyPropertyChanged();
}
}
}
viewSource.Refresh()不会触发collectionviewsource上的filter事件。我检查了过滤事件仅在加载用户控件时才触发。
到目前为止已尝试:
如果您可以为上述问题推荐任何基于mvvm的解决方案,将很有帮助。
在视图中的名为“ SystemCollection”的Refresh()
上调用CollectionViewSource
或在视图模型中实现ICollectionView
或任何其他类型的源集合,然后从那里刷新它。
如果生成的LiveFilteringProperties
实现了CollectionView
接口,则添加ICollectionViewLiveShaping
也应该起作用。