如何在C#中创建一个Observable Hashset?

时间:2009-02-09 02:28:08

标签: c# wpf data-binding

目前我在WPF应用程序中使用ObservableCollection,该应用程序是Conway生命游戏的一个实现,适用于大约500个单元格,但之后它开始显着减速。我最初使用HashSet编写应用程序但无法找到将单元格绑定到画布的任何方法。

有没有办法让我的HashSet通知其绑定对象有变化?我的Cell类是一个简单的整数X,Y对,如果该对存在,则该单元处于活着状态,否则死亡。 Cell实现了INotifyPropertyChanged并覆盖了GetHashCode和Equals。我无法让细胞显示任何变化,只是加载后立即出现的细胞。有没有办法将Hashset绑定到Canvas上的项目?

3 个答案:

答案 0 :(得分:14)

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

如果你愿意,你可以简单地退出方法而不是抛出异常。

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);
    }
}

答案 1 :(得分:11)

你也必须实施INotifyCollectionChanged,然后一切正常。还有另一个相关的SO答案,uses freezables确保基础实体的变化也得到处理。

答案 2 :(得分:11)

我在这里发布了一个完整的ObservableHashSet,你可以使用它。

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

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