C#:ObservableCollection - 为什么是虚拟“CollectionChanged”事件?

2023-12-15

为什么 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(使用前将#替换为@)

C#:ObservableCollection - 为什么是虚拟“CollectionChanged”事件? 的相关文章

随机推荐