为什么 CollectionChanged 事件是virtual in ObservableCollection
?我们有虚拟的OnCollectionChanged
方法,这应该足以覆盖事件调用吧?
我没有看到这个的任何用途,而且虚拟事件也是邪恶的。虚拟事件的笨拙使用会带来很多逻辑问题,但是虚拟事件即使在框架中也存在。
这只是糟糕的设计还是有人在现实中使用它?
我们可以讨论基类和设计,但这不是直接/学术的答案,而是更多的例子。我个人觉得我可以扩展 ObservableCollection 并重写 OnCollectionChanged ,这很棒。 ObservableCollection 非常健谈,每次添加/删除项目时,它都会用属性更改消息轰炸 UI 线程并减慢速度(例如,在数据网格中,其中的每个绑定都会更新)。因此,据我所知,许多人扩展 ObservableCollection 来抑制此类通知,直到添加完项目为止。只是因为 WPF 控制 DataGrids/ListViews 等。响应 CollectionChanged 这是有效的。
这是用法,我刷新数据,而不是一次添加一个项目,而是填充一个列表,然后用它重置 ObservableCollection 一次,这极大地加快了 UI 响应速度:
private void OnExecuteRefreshCompleted(IEnumerable<MyObject> result)
{
UiUtilities.OnUi(() => { _myObservableCollectionField.Reset(result, true);
});
这是我的扩展课程:
public class ObservableCollectionExtended<T> : ObservableCollection<T>
{
private bool _suppressNotification;
//without virtual , I couldn't have done this override
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (!_suppressNotification)
base.OnCollectionChanged(e);
}
public void Clear(bool suppressNotificationUntillComplete)
{
_suppressNotification = suppressNotificationUntillComplete;
Clear();
_suppressNotification = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
public void ClearItems(bool suppressNotificationUntillComplete)
{
_suppressNotification = suppressNotificationUntillComplete;
base.ClearItems();
_suppressNotification = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
public void AddRange(IEnumerable<T> list, bool suppressNotificationUntillComplete)
{
if (list == null)
throw new ArgumentNullException("list");
_suppressNotification = suppressNotificationUntillComplete;
foreach (T item in list)
Add(item);
_suppressNotification = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
/// <summary>
/// clears old items, and new ones
/// </summary>
/// <param name="list"></param>
/// <param name="suppressNotificationUntillComplete"></param>
public void Reset(IEnumerable<T> list, bool suppressNotificationUntillComplete)
{
if (list == null)
throw new ArgumentNullException("list");
_suppressNotification = suppressNotificationUntillComplete;
Clear();
foreach (T item in list)
Add(item);
_suppressNotification = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)