【问题标题】:How to have Lists with events upon change in List如何在列表更改时拥有带有事件的列表
【发布时间】:2010-11-23 06:54:06
【问题描述】:

我是活动的新手。 This example 表明每次更改 ArrayList 时都会调用一个事件。我想知道如何使用泛型来做到这一点。对你实现 IList 还是扩展 List?我试图对其进行编码,但我被卡住了。

using System;
using System.Collections.Generic;

namespace Events
{
    public delegate void ChangedEventHandler(object sender, EventArgs e);

    public class ListWithChangedEvent<T> : IList<T>
    {
        public event ChangedEventHandler Changed;

        protected virtual void OnChanged(EventArgs e)
        {
            if (Changed != null)
            {
                Changed(this, e);
            }
        }

        public void Add(T value)
        {
            base.Add(value);
            OnChanged(EventArgs.Empty);
        }

        public void Clear()
        {
            base.Clear();
            OnChanged(EventArgs.Empty);
        }

        public T this[int index]
        {
            set
            {
                base[index] = value;
                OnChanged(EventArgs.Empty);
            }
        }
    }

    class EventListener
    {
        private ListWithChangedEvent<string> List;

        public EventListener(ListWithChangedEvent<string> list)
        {
            List = list;
            List.Changed += new ChangedEventHandler(ListChanged);
        }

        private void ListChanged(object sender, EventArgs e)
        {
            Console.WriteLine("This is called when the event fires.");
        }

        public void Detach()
        {
            List.Changed -= new ChangedEventHandler(ListChanged);
            List = null;
        }
    }

    class Program
    {
        public static void Main(string[] args)
        {
            ListWithChangedEvent<string> list = new ListWithChangedEvent<string>();

            EventListener listener = new EventListener(list);

            list.Add("item 1");
            list.Clear();
            listener.Detach();
        }
    }
}

【问题讨论】:

    标签: c# events list generics delegates


    【解决方案1】:

    您可以使用 ObservableCollection 并且可以扩展它!!
    命名空间:System.Collections.ObjectModel
    程序集:WindowsBase(在 WindowsBase.dll 中)

    每当列表更改时,此集合都会触发事件。(例如添加任何项目,从列表中删除)

    但请注意:如果 ObservableCollection 持有的对象的内部属性发生变化,则不会触发事件。如果您需要,请告诉我,我已经扩展了 Observable 集合以具有该功能。

    【讨论】:

    • 你能发布那个收藏吗?我相信其他人会发现它很有用(虽然我可能会同时实现我自己的)。
    • 这是一个非常好的此类类的实现:stackoverflow.com/a/5256827/830254
    • ObservableCollection.Clear() 使用 NotifyCollectionChangedEventArgs Action == Reset 引发 CollectionChanged 事件,并且清空 OldItems 和 NewItems 使得无法跟踪从集合中删除的项目
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    相关资源
    最近更新 更多