如何在 C# 中创建可观察的哈希集?

问题描述 投票:0回答:4

目前我正在 WPF 应用程序中使用 ObservableCollection,该应用程序是康威生命游戏的实现,对于大约 500 个单元格运行良好,但之后它开始显着减慢。我最初使用 HashSet 编写了该应用程序,但找不到任何方法将单元格绑定到画布。

有没有办法让我的 HashSet 通知其绑定对象发生更改?我的 Cell 类是一个简单的整数 X,Y 对,如果该对存在,则细胞是活的,否则是死的。 Cell 实现 INotifyPropertyChanged 并覆盖 GetHashCode 和 Equals。我无法让单元格显示任何更改,只能显示加载后立即出现的单元格。有没有办法将哈希集绑定到画布上的项目?

c# wpf data-binding
4个回答
16
投票

我不知道这是否有帮助,但这是我为个人项目制作的“可观察集”的真正简单实现。它本质上是防止插入(或覆盖)集合中已有的项目。

如果您愿意,您可以简单地从方法中返回,而不是抛出异常。

public class SetCollection<T> : ObservableCollection<T> 
{
    protected override void InsertItem(int index, T item)
    {
        if (Contains(item)) throw new ItemExistsException(item);

        base.InsertItem(index, item);
    }

    protected override void SetItem(int index, T item)
    {
        int i = IndexOf(item);
        if (i >= 0 && i != index) throw new ItemExistsException(item);

        base.SetItem(index, item);
    }
}

12
投票

你也必须实现INotifyCollectionChanged,然后一切都应该可以正常工作。还有另一个相关的 SO 答案,它使用 freezables 来确保底层实体的更改也得到处理。


12
投票

我在这里发布了一个完整的 ObservableHashSet 供您使用。

https://github.com/BellaCode/Public/tree/master/ObservableHashSet

它基于对 ObservableCollection 如何实现的反思,并提供相同的线程安全重入检查。


© www.soinside.com 2019 - 2024. All rights reserved.