List, ObservableCollection и INotifyPropertyChanged в Silverlight

В этой статье даны основные сведения о списках List, наборах ObservableCollection и интерфейсах INotifyPropertyChanged.

Различие между List<T>, ObservableCollection<T> и INotifyPropertyChanged

List<T>

Он является списком объектов со строгим контролем типов. К объектам можно получить доступ по индексу. Он предоставляет методы для поиска, сортировки и обработки списков. Класс List<T> - это универсальный эквивалент класса ArrayList. Он реализует универсальный интерфейс IList<T>, использующий массив, размер которого динамически увеличивается при необходимости.

Недостатки

В ASP.NET просто используются DataSource и DataBind() для связывания данных, но в Silverlight это несколько по-другому. Привязка данных в ASP.NET делается без запоминания состояния – как только операция связывания завершена, она является свершившимся фактом.  Если же вы хотите что-то изменить, то вам приходится манипулировать лежащими в основе элементами управления, которые были созданы в результате привязки данных, или иначе изменять лежащие в основе объекты данных и снова вызывать DataBind(). Мы использовали этот метод – но он не совсем правильный.

В примере приложения значения в списке добавляются, удаляются и меняются в течение времени выполнения в коде ниже. Изменения в списке не будут обновлены к пользовательскому интерфейсу (Datagrid).

ObservableCollection<T>

ObservableCollection – это универсальная динамическая совокупность (коллекция) данных, предоставляющая уведомления (использующая интерфейс "INotifyCollectionChanged"), когда элементы добавляются, удаляются, или когда вся совокупность данных обновляется.

Примечание: Класс посредника сервиса WCF в Silverlight использует коллекцию этого типа по умолчанию.

Недостатки

Он не предоставляет никаких уведомлений, когда какое-либо свойство в коллекции изменено.

В примере приложения значения в наблюдаемой коллекции добавляются, удаляются и меняются в течение времени выполнения в коде ниже. Операции (добавление и удаление элемента) в наблюдаемой коллекции будут обновлены к пользовательскому интерфейсу (Datagrid). Но любое изменение в существующем элементе не будет обновлено к пользовательскому интерфейсу.

INotifyPropertyChanged

INotifyPropertyChanged – это не коллекция, а интерфейс, используемый в классах объектов данных, для предоставления уведомления PropertyChanged клиентам, когда значение любого свойства изменяется. Это позволяет вызывать событие PropertyChanged всякий раз, когда состояние объекта меняется (добавлен, удален или изменен) в точке, где вы хотите сообщить нижележащей коллекции или контейнеру, что состояние изменилось.

INotifyPropertyChanged совместим со всеми типами коллекций, такими как List<T>, ObservableCollection<T>, и т.д. Фрагмент кода, использующий INotifyPropertyChanged, показан ниже:

 public class UserNPC:INotifyPropertyChanged

{

    private string name;

    public string Name {

        get { return name; }

        set { name = value; onPropertyChanged(this, "Name"); }

    }

    public int grade;

    public int Grade {

        get { return grade; }

        set { grade = value; onPropertyChanged(this, "Grade"); }

    }

 

    // Объявление события PropertyChanged (свойство изменилось)

    public event PropertyChangedEventHandler PropertyChanged;

 

    // OnPropertyChanged вызовет событие PropertyChanged, передав

    // исходное свойство, которое обновляется.

    private void onPropertyChanged(object sender, string propertyName)

    {

        if (this.PropertyChanged != null)

        {

            PropertyChanged(sender, new PropertyChangedEventArgs(propertyName));

        }

    }

}

В вышеприведенном фрагменте кода, всякий раз, когда свойству присваивается значение, будет вызываться метод “onPropertyChanged”, который, в свою очередь, вызывает событие PropertyChanged.