c# - 在 MVVM 中对 ViewModel 进行批量更改时,如何使用批处理,例如 BeginUpdate/EndUpdate?

标签 c# .net wpf mvvm

在我使用 MVVM 的 Silverlight 应用程序中,我有一个图表(第 3 方 ComponentOne)绘制了大量数据,因此需要大量时间来呈现。

我的 ViewModel 中有一个 ObservableCollection(比如 chartDataCollection),它绑定(bind)到图表的数据源。

在某些情况下,我在 chartDataCollection 中添加了 100 多个项目,这导致 CollectionChange 事件被触发 100 次并且每次都呈现图表,这会花费很多时间。

C# 中是否有任何方法可以将这些更新组合在一起并在完成后仅通知 UI 一次? 就像我们过去在 Winforms 世界中使用 BeginUpdate 向数据网格添加数据和EndUpdate 语句。

最佳答案

要实现的接口(interface)是 INotifyCollectionChanged。此接口(interface)通过 CollectionChanged 事件与 WPF 绑定(bind)通信 - 此事件的参数 (NotifyCollectionChangedEventArgs) 可以报告已更改的项目批处理。

一种方法是实现您自己的 MyBatchObservableColleciton,派生或(更好)嵌入列表(或任何其他适当的集合)。实现修改内部集合的方法并记录所有这些更改。当您准备好将所有更改提交到 WPF 时,只需发送更改列表即可。以下是您可以执行的操作的一个子集示例(仅向您的集合实现“添加”功能):

class BatchObservableColleciton<T> : INotifyCollectionChanged, IEnumerable
{
    public event NotifyCollectionChangedEventHandler CollectionChanged;

    private List<T> _list;
    private List<T> _addedItems;

    public BatchObservableColleciton( ) {
        _list = new List<T>( );
        _addedItems = new List<T>( );
    }
    
    public IEnumerator GetEnumerator( )
    {
        return _list.GetEnumerator( );
    }

    public void Add( T item )
    {
        _list.Add( item );
        _addedItems.Add( item );
    }

    public void Commit( ) {
        if( CollectionChanged != null ) {
            CollectionChanged( this, new NotifyCollectionChangedEventArgs(
                NotifyCollectionChangedAction.Add, _addedItems ) );
        }
        _addedItems.Clear( );
    }

}

我自己从未尝试过,但我认为这是可行的方法。谷歌自定义和 ObservableCollection。虽然不准确,但很少有实现。

关于c# - 在 MVVM 中对 ViewModel 进行批量更改时,如何使用批处理,例如 BeginUpdate/EndUpdate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9305685/

相关文章:

c# - 分类逻辑回归,库

c# - WPF contextmenu 有很多项目很慢 - 我怎样才能加快速度?

c# - 从 Mahapps 继承样式以在 WPF 中自定义 GroupBox Header

c# - .NET Core 3 迁移的其他探测路径

c# - 在 Accord.Net 中如何使用 One-Class SVM 进行异常检测?

c# - ICSharpCode.SharpZipLib.Zip.FastZip 不压缩文件名中包含特殊字符的文件

c# - 如何将 WPF 计时器格式化为 HH :MM:SS

c# - XNA 与 C++ 引擎

c# - 关闭 Xamarin.Forms DisplayAlert

c# - 对于 Func<T, TResult>,其中 A extends T,A 不满足 T