C#自定义事件处理程序

7
如果我有一个属性:
public list<String> names { get; set; }

如何生成和处理一个自定义事件,以参数为例,称为'onNamesChanged',每当名称添加到列表中时?

5个回答

12

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
哇,我不知道你可以用事件做到那个!那真是相当棒! - Nicholas Mancuso
1
非常好。我不知道这是可能的。 - Steve

10

10

BindingList的另一种替代品是ObservableCollection - 在这种情况下,您需要订阅自己的事件处理程序来响应CollectionChanged事件并根据操作触发您自己的事件。


0

David Mohundro 展示了一种方法;另一个选项是从 Collection<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>)- 这需要大量的工作,但收益很少。


0

一个非传统的方法可能是使用像PostSharp这样的AOP框架,在调用访问器之前/之后“编织”一个处理程序,触发一个事件。

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

请注意,在获取比较值(在处理程序代码内部)时,您可能会陷入无限循环(您调用属性访问器,该访问器调用AOP处理程序,该处理程序调用访问器,依此类推),因此您可能需要反射到包含此属性的类中以获得支持字段。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接