NotifyCollectionChangedAction: экземпляр объекта при удалении? - PullRequest
2 голосов
/ 18 сентября 2010

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

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

Так что, думаю, я мог бы:

  • Только пройти действие «Удалить»
  • Передайте действие удаления вместе с нулевым объектом и индексом
  • Передайте действие удаления вместе с удаленным объектом и индексом

Кого из них вы бы предпочли? Я немного боюсь неправильной реализации такого «основного» интерфейса и, возможно, вызываю явно не связанные ошибки ...

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

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

Ответы [ 2 ]

1 голос
/ 18 сентября 2010

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

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

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

0 голосов
/ 18 сентября 2010

По сути, вы замучены.

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

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

...