List, ObservableCollection и INotifyPropertyChanged в Silverlight
Различие между 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.