gpt4 book ai didi

wpf - C# : ObservableCollection - why virtual “CollectionChanged” event?

转载 作者:行者123 更新时间:2023-12-04 02:54:53 28 4
gpt4 key购买 nike

为什么 CollectionChanged 事件在 ObservableCollection 中是虚拟的?我们有虚拟的 OnCollectionChanged 方法,它应该足以覆盖事件调用吧?

我没有看到任何用法,虚拟事件也是邪恶的。不恰本地使用虚拟事件会带来很多逻辑问题,但虚拟事件即使在框架中也存在。

这只是糟糕的设计还是有人在实际使用它?

最佳答案

我们可以就基类和设计进行辩论,但这里不是直接/学术性的答案,而是更多的示例。我个人觉得我可以扩展 ObservableCollection 并覆盖 OnCollectionChanged 很棒。 ObservableCollection 非常繁琐,每次您添加/删除项目时,它都会用属性更改消息轰炸 UI 线程并减慢速度(例如,在数据网格中,其中的每个绑定(bind)都会更新)。因此,据我所知,许多人扩展 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));
}
}

关于wpf - C# : ObservableCollection - why virtual “CollectionChanged” event?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16858479/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com