2008-10-20 66 views
7

如果我有一个属性:C#自定义事件处理

public list<String> names { get; set; } 

我如何产生和处理为了讨论一个自定义的事件称为“onNamesChanged”只要名字被添加到列表中?

回答

-1

您不需要直接将列表作为属性公开,也可以让您的类实现IList或某些类,然后让Add()方法触发您的事件处理程序。

+0

就是这样.NET 1.1 :)就像Marc Gravell说的......很多工作,没有什么好处。 – 2008-10-20 13:14:22

0

David Mohundro展示了一种方法;另外一个选择是从收藏<牛逼>继承和覆盖各种方法:

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的<牛逼>)从第一原理 - 大量的工作,没有什么好处。

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

当。今天我学到了另一件新事物。 :) – 2008-10-20 13:12:18

+1

哇,我不知道你可以用事件做到这一点!这很漂亮! – 2008-10-20 14:41:42

0

非正统方法可能使用AOP框架(如PostSharp)在调用访问器之前/之后“编织”处理函数,该函数会触发事件。

您创建一个外部类,其中包含访问您的属性时的预处理和/或后处理代码,检查属性的值是否在前后变化以及是否引发事件。请记住,虽然在比较的过程中(在你的处理程序代码中),你可能进入一个无限循环(你调用属性访问器,它调用AOP处理器,它调用访问器等等),所以您可能需要反映到包含此属性的类中以获得支持字段。