Как реализовать мероприятие - PullRequest
2 голосов
/ 27 июня 2009
class Foo(){
  public List<string> SomeCollection;
}

Мне нужно реализовать событие, которое может сработать при добавлении или удалении чего-либо из Коллекции. Как это сделать?

Ответы [ 5 ]

2 голосов
/ 27 июня 2009

List<T> не имеет поддержки уведомлений. Вы можете посмотреть на BindingList<T>, который имеет события - или Collection<T>, который может быть унаследован с помощью методов переопределения.

Если вы хотите выставить событие на уровне Foo, возможно, что-то вроде ниже - но может быть легче оставить его в списке:

class Foo{
    public event EventHandler ListChanged;
    private readonly BindingList<string> list;
    public Foo() {
        list = new BindingList<string>();
        list.ListChanged += list_ListChanged;
    }
    void  list_ListChanged(object sender, ListChangedEventArgs e) {
        EventHandler handler = ListChanged;
        if (handler != null) handler(this, EventArgs.Empty);
    }
    public IList<string> SomeCollection {get {return list;}}
}
2 голосов
/ 27 июня 2009

Посмотрите на классы BindingList и ObservableCollection (в пространствах имен System.ComponentModel и System.Collections.ObjectModel соответственно) - любой из них должен хорошо выполнять свою работу для вы.

Обратите внимание, что два класса обычно предоставляют одинаковую функциональность, но они немного отличаются . BindingList обычно больше подходит для привязки данных / пользовательского интерфейса (отсюда и название), поскольку он позволяет отменять обновления и тому подобное. Тем не менее, ObservableCollection, возможно, более уместен в вашем случае, так как вы просто заинтересованы в получении уведомлений об изменениях (казалось бы), и класс был разработан исключительно с этой точки зрения. Тот факт, что они существуют в очень разных пространствах имен, намекает на это. Если вам нужны точные сведения о сходствах и различиях, я рекомендую вам проверить связанные документы MSDN.

1 голос
/ 27 июня 2009

Вы можете взглянуть на этот урок по созданию своих собственных событий.

0 голосов
/ 27 июня 2009

базовый ...

вот хорошая ссылка

public class Foo
{
private List<string> _SomeCollection;
public event EventHandler Added;

public void Add(string item)
{
    SomCollection.Add(item);
    OnAdd();

}

private void OnAdd()
{
    if (Added != null)
    {
        Added.Invoke(this, EventArgs.Empty);
    }
}
}
0 голосов
/ 27 июня 2009

Вы можете сделать это, используя ObservableCollection вместо списка.

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