C#自定义事件处理程序

时间:2008-10-20 12:52:34

标签: c# properties event-handling

如果我有房产:

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

每当名称被添加到列表中时,如何生成和处理名为'onNamesChanged'的自定义事件?

6 个答案:

答案 0 :(得分:13)

BindingList可能是您的最佳选择,因为它具有内置的更改跟踪和您可以使用的各种现有事件。下面是一个公开Add的自定义事件的示例,该事件转发到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 :(得分:10)

答案 2 :(得分:10)

BindingList的一个替代方案是ObservableCollection - 在这种情况下,您希望将自己的事件处理程序订阅到CollectionChanged事件,并根据操作触发您的事件。

答案 3 :(得分:0)

David Mohundro展示了一种方法;另一个选择是从Collection&lt; T&gt;继承。并覆盖各种方法:

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&lt; T&gt;) - 很多工作,收效甚微。

答案 4 :(得分:0)

非正统的方法可能是使用AOP框架(如PostSharp)在调用访问器之前/之后“编织”处理程序,从而触发事件。

您创建了一个外部类,其中包含访问您的属性时的预处理和/或后处理代码,检查属性的值是否在pre和post之间发生更改,并引发事件。

请记住,在获取比较值时(在处理程序代码中),您可能会进入无限循环(您调用属性访问器,它调用AOP处理程序,调用访问器等等),所以您可能需要反映到包含此属性的类中以获得支持字段。

答案 5 :(得分:-1)

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