我有一个 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 中似乎不提供这种功能,是吗?)
非常简单。您只需将集合视图移动到视图模型中即可:
在
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">
就是这样。现在您可以访问视图模型内的集合视图,您可以在其中修改过滤器。
您的问题有多种解决方案,但在我看来,最好的解决方案是仅使用标准 WPF
DataGrid
控件的样式,而不发明新的继承 DataGird
类型或依赖于其他第三方控件。以下是我找到的最佳解决方案:
我还有一个问题。我也这样做。但是我现在如何处理 ObservableCollection 中模型的属性更改呢?无论如何,它不会在模具视图中刷新。