2008-10-20 4 views

ответ

-1

Вам не нужно раскрывать список непосредственно как свойство и, возможно, реализовать свой класс IList или некоторые из них, тогда у вас есть обработчик событий в методе Add().

+0

Это так .NET 1.1 :) Как Марк Гравелл сказал ... много работы, мало пользы. –

0

Дэвид Мохондро показывает один подход; один другой вариант, чтобы наследовать от коллекции <T> и переопределить различные методы:

class Foo {} 
class FooCollection : Collection<Foo> 
{ 
    protected override void InsertItem(int index, Foo item) 
    { 
     // your code... 
     base.InsertItem(index, item); 
    } 
    protected override void SetItem(int index, Foo item) 
    { 
     // your code... 
     base.SetItem(index, item); 
    } 
    // etc 
} 

Наконец, вы можете создать свой собственный список (IList, IList <T>) из первых принципов - много работы, мало пользы ,

13

BindingList, скорее всего, ваш лучший вариант, поскольку он имеет встроенное отслеживание изменений и множество существующих событий, которые вы можете использовать. Ниже приведен пример предоставления настраиваемого события для добавления, которое пересылается в событие BindingList.


    class Example 
    { 
     private BindingList<string> m_names = new BindingList<string>(); 
     public IEnumerable<string> Names { get { return m_names; } } 
     public event AddingNewEventHandler NamesAdded 
     { 
      add { m_names.AddingNew += value; } 
      remove { m_names.AddingNew -= value; } 
     } 
     public void Add(string name) 
     { 
      m_names.Add(name); 
     } 
    } 
+1

Dang. Сегодня я узнаю еще одно новое. :) –

+1

Эй, я не знал, что ты можешь это сделать с событиями! Thats довольно пятно! –

+1

Очень приятно. Я понятия не имел, что это возможно. – Steve

10

Одна альтернатива BindingList является ObservableCollection - в этом случае вы хотите подписаться собственный обработчик события к событию CollectionChanged и стреляйте событие в зависимости от действия.

+0

Еще один голос здесь. Я все еще не могу перестать учиться :) –

0

Неортодоксальный подход может использовать структуру AOP, такую ​​как PostSharp, чтобы «переплетать» обработчик до/после вызова аксессуара, который запускает событие.

Вы создаете внешний класс, который содержит код обработки до и/или после обработки вашего свойства, проверьте, изменилось ли значение свойства между pre и post, и поднимите событие.

Помните, что, принимая значение для сравнения (внутри кода вашего обработчика), вы можете попасть в бесконечный цикл (вы вызываете аксессуар свойства, который вызывает обработчик AOP, который вызывает аксессор и т. Д.), поэтому вам может понадобиться задуматься над классом, содержащим это свойство, чтобы получить поле поддержки.