NotifyCollectionChangedAction: экземпляр объекта при удалении?

В настоящее время я реализую интерфейс INotifyCollectionChanged для коллекции с довольно важными и недолговечными элементами. Все эти элементы реализуют IDispose, который можно вызвать непосредственно перед удалением из коллекции. Я не контролирую приказ об уничтожении, мне просто нужно принять его, как только он появится.

Моя проблема теперь в том, как распространять действия «Удалить». Конструктор NotifyCollectionChangedAction предоставляет вариант только с указанным действием, но у меня есть индекс удаленного элемента. К сожалению, перегрузки нет, только индекс.

Думаю, я мог:

  • Пройдите только действие "Удалить"
  • Передайте действие удаления вместе с "нулевым" объектом и индексом.
  • Передайте действие удаления вместе с удаленным объектом и индексом

Что из этого вы бы предпочли? Я немного боюсь реализовать такой "основной" интерфейс неправильно и, возможно, вызвать не очевидно связанные ошибки ...

Я не смог найти никаких рекомендаций, что происходит с элементами, которые находятся в списках «изменений», есть ли какие-либо доступные?

Примечание: коллекция не будет сразу же привязана к WPF, если это важно.


person Marcus Riemer    schedule 18.09.2010    source источник


Ответы (2)


Из того, что я вижу в MSDN, единственными подходящими наборами данных для remove являются перегрузить экземпляр, а перегрузка принимает экземпляр и индекс. Вы можете попробовать последний, передавая только индекс; это может работать ... но, учитывая наличие первой перегрузки, я не надеюсь. Если вы не передадите ему объект, нижестоящий код может не иметь возможности узнать, какой элемент был изменен. Я думаю, вам придется передать объект. Обычно это не должно вызывать проблем, поскольку большая часть кода просто будет использовать его для проверки ссылок; объект все еще там (он не был собран) - он только что был удален, где "просто" используется ... субъективно (поскольку это может по-прежнему вызывать вопросы).

Другой вариант, конечно же, - обернуть объект фасадом. Тогда не имеет значения, удален ли фактический объект, установлен в значение null и / или собран сборщиком мусора; фасад все еще существует (но он должен быть закодирован для обработки недоступного объекта).

Как окончательный вариант; вы должны использовать их коллекцию? Не могли бы вы просто обернуть эту коллекцию, чтобы вы сами выбирали, когда рассказывать ей об этих вещах? ТОГДА вы сохраните полный контроль над сроками жизни ...

person Marc Gravell    schedule 18.09.2010
comment
Упс, фасад объекта в коллекции - это то, о чем я не думал ... Спасибо, я еще раз проконсультируюсь с коллегами. - person Marcus Riemer; 18.09.2010
comment
Еще одна хорошая идея - упаковка самой коллекции, думаю, мне нужно подумать нестандартно. - person Marcus Riemer; 18.09.2010

По сути, вы заболели.

  • Уничтожение объектов перед удалением - это нарушение работы интерфейса. Точка. Вы не можете контролировать это - тогда вы не можете правильно реализовать NotifyCollectionChangedAction.

  • Вы должны передать индекс и удаленный объект.

person TomTom    schedule 18.09.2010