Какая польза от ObservableCollection в .net? - PullRequest
212 голосов
/ 25 ноября 2010

Какая польза ObservableCollection в .net?

Ответы [ 7 ]

208 голосов
/ 25 ноября 2010

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

Код ниже на самом деле ничего не делает, но демонстрирует, как вы присоединяете обработчик к классу, а затем используете аргументы события для некоторой реакциик изменениям.В WPF уже есть много операций, таких как обновление встроенного пользовательского интерфейса, поэтому вы можете получить их бесплатно при использовании ObservableCollections

class Handler
{
    private ObservableCollection<string> collection;

    public Handler()
    {
        collection = new ObservableCollection<string>();
        collection.CollectionChanged += HandleChange;
    }

    private void HandleChange(object sender, NotifyCollectionChangedEventArgs e)
    {
        foreach (var x in e.NewItems)
        {
            // do something
        }

        foreach (var y in e.OldItems)
        {
            //do something
        }
        if (e.Action == NotifyCollectionChangedAction.Move)
        {
            //do something
        }
    }
}
148 голосов
/ 25 ноября 2010

An ObservableCollection работает в основном как обычная коллекция, за исключением того, что она реализует интерфейсы:

Как таковой, он очень полезен, когда вы хотите знать, когда коллекция изменилась. Инициируется событие, которое сообщит пользователю, какие записи были добавлены / удалены или перемещены.

Что еще более важно, они очень полезны при использовании привязки данных в форме.

49 голосов
/ 03 сентября 2014

Из Pro C # 5.0 и .NET 4.5 Framework

Класс ObservableCollection<T> очень полезен тем, что он способен информировать внешние объекты, когда его содержимое изменилось в некоторыхспособ (как вы можете догадаться, работа с ReadOnlyObservableCollection<T> очень похожа, но доступна только для чтения).Во многих отношениях работа с ObservableCollection<T> идентична работе с List<T>, учитывая, что оба этих класса реализуют одинаковые основные интерфейсы.Класс ObservableCollection<T> уникален тем, что этот класс поддерживает событие с именем CollectionChanged.Это событие будет срабатывать всякий раз, когда вставляется новый элемент, текущий элемент удаляется (или перемещается), или если вся коллекция изменяется.Как и любое событие, CollectionChanged определяется в терминах делегата, который в данном случае равен NotifyCollectionChangedEventHandler.Этот делегат может вызывать любой метод, который принимает объект в качестве первого параметра и NotifyCollectionChangedEventArgs в качестве второго.Рассмотрим следующий метод Main (), который заполняет наблюдаемую коллекцию, содержащую объекты Person, и связывает событие CollectionChanged:

class Program
{
   static void Main(string[] args)
   {
     // Make a collection to observe and add a few Person objects.
     ObservableCollection<Person> people = new ObservableCollection<Person>()
     {
        new Person{ FirstName = "Peter", LastName = "Murphy", Age = 52 },
        new Person{ FirstName = "Kevin", LastName = "Key", Age = 48 },
     };
     // Wire up the CollectionChanged event.
     people.CollectionChanged += people_CollectionChanged;
     // Now add a new item.
     people.Add(new Person("Fred", "Smith", 32));

     // Remove an item.
     people.RemoveAt(0);

     Console.ReadLine();
   }
   static void people_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
   {
       // What was the action that caused the event?
        Console.WriteLine("Action for this event: {0}", e.Action);

        // They removed something. 
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
        {
            Console.WriteLine("Here are the OLD items:");
            foreach (Person p in e.OldItems)
            {
                Console.WriteLine(p.ToString());
            }
            Console.WriteLine();
        }

        // They added something. 
        if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
        {
            // Now show the NEW items that were inserted.
            Console.WriteLine("Here are the NEW items:");
            foreach (Person p in e.NewItems)
            {
                Console.WriteLine(p.ToString());
            }
        }
   }
}

Входящий параметр NotifyCollectionChangedEventArgs определяет два важных свойства, OldItems и NewItems, который предоставит вам список предметов, которые были в данный момент в коллекции до события, и новые предметы, которые были вовлечены в изменение.Тем не менее, вы захотите изучить эти списки только при правильных обстоятельствах.Напомним, что событие CollectionChanged может возникать при добавлении, удалении, перемещении или сбросе элементов.Чтобы узнать, какое из этих действий вызвало событие, вы можете использовать свойство Action объекта NotifyCollectionChangedEventArgs.Свойство Action можно проверить на любом из следующих элементов перечисления NotifyCollectionChangedAction:

public enum NotifyCollectionChangedAction
{
Add = 0,
Remove = 1,
Replace = 2,
Move = 3,
Reset = 4,
}

Members of System.Collections.ObjectModel

19 голосов
/ 25 февраля 2016

Объяснение без кода

Для тех, кто хочет получить ответ без кода за ним (бум-тиш), я подниму руку:

Нормальные коллекции - Нет уведомлений

Время от времени я иду в Нью-Йорк, и моя жена просит меня купить вещи.Поэтому я беру список покупок с собой.В списке есть много вещей, таких как:

  1. Сумочка Louis Vuitton (5000 долларов)
  2. Дух Клайв Кристиан Императорского Величества (215 000 долларов)
  3. Солнцезащитные очки Gucci (2000 долларов))

хахаха, хорошо, я не покупаю эти вещи. Поэтому я вычеркиваю их и удаляю из списка, а вместо этого добавляю:

  1. 12 дюжин шаров Titleist для гольфа.
  2. 12 фунтов мяч для боулинга.

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

ObservableCollection - уведомления о внесенных изменениях

Теперь, когда я что-то удаляю из списка: она получаетуведомление на ее телефон (т.е. смс / электронная почта и т. д.)!

Наблюдаемая коллекция работает точно так же. Если вы добавляете или удаляете что-то в нее или из нее: кто-то уведомляется. А когда они уведомляются, ну тогдаони называют тебя и тебяполучу ухо-полно.Конечно, последствия настраиваются через обработчик событий.

Вот и все!

7 голосов
/ 25 ноября 2010

Одним из наиболее важных применений является то, что вы можете привязать компоненты пользовательского интерфейса к одному, и они будут реагировать соответствующим образом, если содержимое коллекции изменится. Например, если вы связываете ListSource ItemsSource с одним из них, содержимое ListView будет автоматически обновляться, если вы измените коллекцию.

EDIT: Вот пример кода из MSDN: http://msdn.microsoft.com/en-us/library/ms748365.aspx

В C # подключить ListBox к коллекции можно так же просто, как и

listBox.ItemsSource = NameListData;

хотя, если вы не подключили список как статический ресурс и не определили NameItemTemplate, вы можете переопределить ToString () PersonName. Например:

public override ToString()
{
    return string.Format("{0} {1}", this.FirstName, this.LastName);
}
6 голосов
/ 25 ноября 2010
class FooObservableCollection : ObservableCollection<Foo>
{
    protected override void InsertItem(int index, Foo item)
    {
        base.Add(index, Foo);

        if (this.CollectionChanged != null)
            this.CollectionChanged(this, new NotifyCollectionChangedEventArgs (NotifyCollectionChangedAction.Add, item, index);
    }
}

var collection = new FooObservableCollection();
collection.CollectionChanged += CollectionChanged;

collection.Add(new Foo());

void CollectionChanged (object sender, NotifyCollectionChangedEventArgs e)
{
    Foo newItem = e.NewItems.OfType<Foo>().First();
}
6 голосов
/ 25 ноября 2010

это коллекция, которая используется в основном для уведомления интерфейса пользователя об изменениях в коллекции, она поддерживает автоматическое уведомление.

В основном используется в WPF,

Где, скажем, предположим, что у вас есть пользовательский интерфейс ссписок и кнопка добавления, и когда вы нажимаете на кнопку он, объект типа предположим, что человек будет добавлен в коллекцию obseravablecollection, и вы привяжете эту коллекцию к ItemSource of Listbox, поэтому, как только вы добавите новый элемент в коллекцию, Listboxобновите себя и добавьте в него еще один элемент.

...