我有一个 DataGrid 绑定到XAML中的 CollectionViewSource 。
<Window.Resources>
<local:MainWindowViewModel x:Key="ViewModel"/>
<CollectionViewSource x:Key="cvsEntries"
Source="{Binding LogEntriesStore,
Source={StaticResource ViewModel}}"/>
</Window.Resources>
LogEntriesStore
是一个 ObservableCollection ( LogEntry 是一个在本次讨论中不重要的DTO)
DataGrid 声明为:
<DataGrid AutoGenerateColumns="False"
Margin="0"
Name="dataGrid1"
ItemsSource="{Binding Source={StaticResource cvsEntries}}"
IsReadOnly="True">
现在我在 DataGrid 中的各个单元格上有上下文菜单,以启动过滤请求。右键单击一个单元格,然后选择过滤器以过滤所有行,并仅显示此特定值。
MVVM获取过滤请求,但现在是棘手的一点。如何在CollectionViewSource上设置过滤器?
(顺便说一下 - 这可能是在公园里用Silverlight PagedCollectionView
散步,但在WPF中似乎没有,是吗?)
答案 0 :(得分:16)
很简单。您只需要在视图模型中移动集合视图:
在MainWindowViewModel
中定义ICollectionView
类型的属性:
public ICollectionView LogEntriesStoreView { get; private set; }
在初始化LogEntriesStore
属性后,您需要使用以下代码初始化LogEntriesStoreView
属性:
LogEntriesStoreView = CollectionViewSource.GetDefaultView(LogEntriesStore);
然后您需要从XAML中删除CollectionViewSource
并修改ItemsSource
绑定以指向新创建的集合视图属性:
<DataGrid AutoGenerateColumns="False"
Margin="0"
Name="dataGrid1"
ItemsSource="{Binding LogEntriesStoreView, Source={StaticResource ViewModel}}"
IsReadOnly="True">
就是这样。现在,您可以访问视图模型中的集合视图,您可以在其中修改过滤器。
答案 1 :(得分:1)
您的问题有几种解决方案,但在我看来,最佳解决方案是仅使用标准WPF DataGrid
控件的样式而不发明新的继承DataGird
类型或依赖于另一个第三方控制。以下是我发现的最佳解决方案: