我们正在使用 WPF + MVVM + Visual Studio 2017。
我们想将其转换为添加实时过滤:
public ObservableCollection<RowViewModel> Rows { get; set; }
下面的方法有两个主要优点:
- 它旨在有效地与 WPF 运行时配合使用,以使用批量更新最小化屏幕呈现。
- 所以速度很快。
- 并且因为样板代码在下面列出,与您在网络上找到的任何其他文档相比,它更容易理解。
请让我知道这是否对您有用,有任何问题,我会更新说明以使其更容易。
和步骤:
第 1 步:非通知集合包装器
创建一个不会触发更新事件的特殊 ObservableCollection。这是一次性的。我们想自己触发更新批量更新事件,这样更快。
public class NonNotifyingObservableCollection<T> : ObservableCollection<T>
{
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { /* Do nothing */ }
}
第 2 步:转换为 NonNotifyingObservableCollection
转换为使用这个新集合的私有变量。
private NonNotifyingObservableCollection<RowViewModel> rows;
// ... and in constructor
rows = new NonNotifyingObservableCollection<RowViewModel>();
第 3 步:添加包装器
添加这些变量:
private ICollectionView rowsView;
public ICollectionViewLiveShaping RowsLiveView { get; set; }
在构造 ViewModel 之后的 Initialise() 调用中(或者可能在构造函数中):
// Call on the dispatcher.
dispatcher.InvokeAsync(() =>
{
this.rowsView = CollectionViewSource.GetDefaultView(this.rows);
this.rowsView.Filter = o =>
{
// This condition must be true for the row to be visible on the grid.
return ((RowViewModel)o).IsVisible == true;
};
this.RowsLiveView = (ICollectionViewLiveShaping)this.rowsView;
this.RowsLiveView.IsLiveFiltering = true;
// For completeness. Changing these properties fires a change notification (although
// we bypass this and manually call a bulk update using Refresh() for speed).
this.RowsLiveView.LiveFilteringProperties.Add("IsVisible");
});
第 4 步:添加项目
现在我们将项目添加到支持集合中,然后调用.Refresh()
以刷新视图:
this.rowsView.Add(new RowViewModel( /* Set properties here. */ ));
然后我们将网格绑定到RowsLiveView
, (而不是Rows
在原始代码中绑定到)。
第 5 步:更新实时过滤
现在我们可以更新IsVisible
属性,然后调用.Refresh()
重绘网格。
rows[0].IsVisible=false;
this.rowsView.Refresh(); // Hides the first row.
更新
更新:这个答案可以简化。的全部意义在于ICollectionViewLiveShaping
无需调用即可自动刷新.Refresh()
。鉴于我们有 aNonNotifyingObservableCollection
并且我们正在使用 a 手动控制所有内容.Refresh()
,因此可以删除public ICollectionViewLiveShaping RowsLiveView { get; set; }
and,直接到RowsView
(使用 , 使其成为属性{ get; set; }
并使用 normal ObservableCollection<>
。换句话说 - ICollectionViewLiveShaping 非常适合少量行(例如<100),但更重要的是,从速度的角度来看ICollectionView
,结合批量更新和手册会更好。Refresh()