目前我正在 WPF 应用程序中使用 ObservableCollection,该应用程序是康威生命游戏的实现,对于大约 500 个单元格运行良好,但之后它开始显着减慢。我最初使用 HashSet 编写了该应用程序,但找不到任何方法将单元格绑定到画布。
有没有办法让我的 HashSet 通知其绑定对象发生更改?我的 Cell 类是一个简单的整数 X,Y 对,如果该对存在,则细胞是活的,否则是死的。 Cell 实现 INotifyPropertyChanged 并覆盖 GetHashCode 和 Equals。我无法让单元格显示任何更改,只能显示加载后立即出现的单元格。有没有办法将哈希集绑定到画布上的项目?
我不知道这是否有帮助,但这是我为个人项目制作的“可观察集”的真正简单实现。它本质上是防止插入(或覆盖)集合中已有的项目。
如果您愿意,您可以简单地从方法中返回,而不是抛出异常。
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);
}
}
你也必须实现INotifyCollectionChanged,然后一切都应该可以正常工作。还有另一个相关的 SO 答案,它使用 freezables 来确保底层实体的更改也得到处理。
我在这里发布了一个完整的 ObservableHashSet 供您使用。
https://github.com/BellaCode/Public/tree/master/ObservableHashSet
它基于对 ObservableCollection 如何实现的反思,并提供相同的线程安全重入检查。
或者你可以从
EntityFramework Core
偷取它
https://github.com/dotnet/efcore/blob/main/src/EFCore/ChangeTracking/ObservableHashSet.cs