在我使用 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/