目前我在WPF应用程序中使用ObservableCollection,该应用程序是Conway生命游戏的一个实现,适用于大约500个单元格,但之后它开始显着减速。我最初使用HashSet编写应用程序但无法找到将单元格绑定到画布的任何方法。
有没有办法让我的HashSet通知其绑定对象有变化?我的Cell类是一个简单的整数X,Y对,如果该对存在,则该单元处于活着状态,否则死亡。 Cell实现了INotifyPropertyChanged并覆盖了GetHashCode和Equals。我无法让细胞显示任何变化,只是加载后立即出现的细胞。有没有办法将Hashset绑定到Canvas上的项目?
答案 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并提供相同的线程安全重入检查。