Как иметь Списки с событиями при изменении в Списке - PullRequest
4 голосов
/ 23 ноября 2010

Я новичок в событиях. Этот пример показывает, что событие вызывается при каждом изменении 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();
        }
    }
}

1 Ответ

6 голосов
/ 23 ноября 2010

Вы можете использовать ObservableCollection и расширять его !!
Пространство имен: System.Collections.ObjectModel
Сборка: WindowsBase (в WindowsBase.dll)

Эта коллекция генерирует события всякий раз, когда список изменяется (скажем, любые элементы добавлены, удалены из списка)

Но обратите внимание: ObservableCollection не запускает события, если изменяются внутренние свойства объектов, которые она содержит. Если вам это нужно, дайте мне знать, я расширил коллекцию Observable, чтобы иметь эту функцию также.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...