Как реализовать мероприятие

2
class Foo(){
  public List<string> SomeCollection;
}

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

Теги:
collections
events

5 ответов

2
Лучший ответ

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;}}
}
  • 1
    Я не вижу смысла в создании собственного класса Collection, когда ObservableCollection отлично справляется со своей работой.
  • 0
    @Noldorin - BindingList <T> одинаково достаточно. Повторное создание подклассов Collection <T>; Есть случаи, когда это подходит - это зависит от сценария.
Показать ещё 2 комментария
2

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

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

  • 0
    (ответил на комментарий; также - разве ObservableCollection <T> в 3.0? Что может быть фактором ...)
  • 0
    MSDN, кажется, предполагает, что ObservableCollection существует с .NET 2.0. С точки зрения функциональности вы в основном правы, говоря, что BindingList предлагает все, что делает ObservableCollection (и немного больше). Однако следует отметить, что ObservableCollection реализует INotifyCollectionChanged и INotifyPropertyChanged, которые полезны в некоторых случаях. Я также считаю, что в некоторых случаях WPF требует ObservableCollection. Как я отмечаю, предполагаемое использование также немного отличается, хотя это мелочь.
1

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

0

базовый...

здесь хорошая ссылка

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
    Я полагаю, это зависит от того, из какого класса вы хотите, чтобы событие было запущено ...
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню