Создайте пользовательскую коллекцию, такую ​​как BindingList, которая работает с ListBox для создания события ListChanging. - PullRequest
1 голос
/ 24 мая 2011

У меня есть ситуация, когда мне нужно знать, когда элемент собирается для добавления / удаления / изменения в коллекции.

Я попытался унаследовать BindingList в классе, который будетвызвать эти события, однако событие «добавления» не работает.Единственный способ, которым я нашел его работающим, - переопределение метода EndNew (), однако я не могу найти способ, какой объект будет добавлен в этом методе (если у кого-то есть решение для этого, это тоже хорошо!) .

Итак, мы создали совершенно новый класс, который наследует от того же интерфейса / класса BindingList и реализовал все (однако я не наследовал ICancelAddNew).

Я связалэто через привязку данных к моему списку, и я обнаруживаю, что ничего не работает (списочные события, ни события обмена списками).Как я могу имитировать поведение BindingList в списке?

Любое предложение высоко ценится, у меня нет других идей для обхода проблемы

РЕДАКТИРОВАТЬ 1:

Это моя коллекция: http://pastie.org/1978601 И вот как я связываю коллекцию с ListBox

        SpellCasterManager.CurrentProfile.ButtonsMacro.ListChanged += new ListChangedEventHandler(ButtonsMacro_ListChanged);
        SpellCasterManager.CurrentProfile.ButtonsMacro.ListChanging += new Expand.ComponentModel.ListChangingEventHandler(ButtonsMacro_ListChanging);
gumpButton.DataBindings.Add("Value", SpellCasterManager.CurrentProfile.ButtonsMacro, "GumpIndex", false, DataSourceUpdateMode.OnPropertyChanged);

На самом деле под подписанными событиями есть просто MessageBox.Show ("bla");

Ответы [ 3 ]

2 голосов
/ 01 июня 2011

Получив четкое представление о том, что вы ищете, я предложу следующие вещи

Вот отличный фреймворк для отмены, который предоставляет множество функциональных возможностей. http://undo.codeplex.com/

Вот образец, http://blogs.msdn.com/b/kirillosenkov/archive/2009/07/02/samples-for-the-undo-framework.aspx

И в вашем случае, вместо того, чтобы пытаться зацепить добавление / редактирование событий, лучше отслеживать после добавления / изменения / удаления события, если вы сохраняете их начальное состояние. Таким образом, если элемент был удален, в вашем предыдущем состоянии он уже будет, если вы начали отслеживать с начального состояния вашей программы.

2 голосов
/ 25 мая 2011

Вы следовали инструкциям MSDN? Ваш класс коллекции должен расширять CollectionBase и реализовывать IBindingList - и это должно быть хорошо.

Также вы можете захотеть, чтобы ваша коллекция item реализовала IEditableObject для поддержки *Edit операций. Это, однако, не требуется - что более важно, ваш элемент коллекции должен иметь способ уведомлять родительскую коллекцию, когда она изменяется (либо следуя коду, предоставленному в MSDN, либо используя, например, INotifyPropertyChanged).


Рабочий пример привязки, реализующий пользовательскую CustomersList, можно найти на IBindingList странице документа (класс Customer можно найти на IEditableObject странице документа).

1 голос
/ 01 июня 2011
  • Ваша коллекция не будет обнаруживать изменения свойств в существующем элементе, поскольку она не подключается к событиям изменения свойства элемента при его добавлении в коллекцию.

  • BindingList<T> прослушивает PropertyChanged для вашего элемента и запускает событие ListChanged при добавлении элемента в BindingList и включает в себя индекс, по которому он добавляется. Попробуйте в тестовом приложении без WinForms.

  • Добавление существующего элемента отличается от AddNew (). Событие AddingNew вызывается только при вызове AddNew () и позволяет вам предоставить новый экземпляр.

  • Когда задействован WinForms, все становится сложнее. Есть о чем думать CurrencyManager, а также BindingSource. Если никакие события не запускаются вообще, проверьте, используете ли вы CurrencyManager / BindingSource, который, по вашему мнению, есть.

  • Я не думаю, что что-либо в рамках использует INotifyPropertyChanging, только оригинальный INotifyPropertyChanged. Возможно, вы захотите использовать Reflector в BindingList, чтобы увидеть, как выполняется перехват, а затем попытаться включить INotifyPropertyChanging, если ваш элемент поддерживает это.

...