Ответ 1
Вам нужно реализовать INotifyCollectionChanged, и тогда все должно работать нормально. Там еще один соответствующий SO-ответ, который использует freezables, чтобы гарантировать, что также будут обрабатываться изменения в базовых сущностях.
В настоящее время я использую ObservableCollection в приложении WPF, приложение является реализацией игры жизни Conway и хорошо работает около 500 ячеек, но после этого оно начинает значительно замедляться. Я изначально написал приложение, используя HashSet, но не смог найти способ привязать ячейки к холсту.
Есть ли способ заставить мой HashSet уведомить об обязательном объекте изменений? Мой класс Cell - это простая целая пара X, Y, если пара существует, ячейка живая, в противном случае мертва. Ячейка реализует INotifyPropertyChanged и переопределяет GetHashCode и Equals. Я не мог заставить ячейку отображать какие-либо изменения, только ячейки, присутствующие сразу после загрузки. Есть ли способ привязать хэш-элемент к элементам на холсте?
Вам нужно реализовать INotifyCollectionChanged, и тогда все должно работать нормально. Там еще один соответствующий SO-ответ, который использует freezables, чтобы гарантировать, что также будут обрабатываться изменения в базовых сущностях.
Я не знаю, поможет ли это, но здесь действительно простая реализация "наблюдаемого набора", который я сделал для личного проекта. Это существенно защищает от вставки (или перезаписи) элемента, который уже находится в коллекции.
Если бы вы хотели, вы могли бы просто вернуться из методов, а не выбрасывать исключение.
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);
}
}
Я разместил здесь полный ObservableHashSet, который вы можете использовать.
https://github.com/BellaCode/Public/tree/master/ObservableHashSet
Он основан на размышлении о том, как реализуется ObservableCollection, и предоставляет те же проверки безопасности перезагрузки потока.