ObservableCollection и CollectionView

Я пишу приложение, которое считывает данные из локальной базы данных и отображает их в списке (я работаю в WPF).

У меня есть объект DVD, где его свойствами являются столбцы базы данных. Этот объект DVD также реализует INotifyPropertyChanged. «MyDVDs» — это таблица, которая ссылается на db. После создания этих объектов я создаю класс, который наследуется от ObservableCollection и берет данные из «MyDVD» в конструкторе. Однако мне нужно не только добавлять, удалять и обновлять данные из списка, но мне также нужно их сортировать и фильтровать. Вот код для ObservableCollection:

class ObservableDVD : ObservableCollection<DVD>
{
    private ICollectionView collection;

    public ObservableDVD(MyDVDs e)
    {
        foreach (DVD d in e.DVDs)
        {
            this.Add(d);
        }
        Collection = CollectionViewSource.GetDefaultView(this);
    }

    public ICollectionView Collection
    {
        get { return collection; }
        private set { collection = value; }
    }

}

Я хотел знать, это хороший способ ?? Или я могу лучше?

В MainWindow проекта, когда срабатывает событие Load_Window, я назначаю свойство Collection для listbox.ItemSource (в отделенном коде MainWindow я объявляю приватное поле, которое, очевидно, относится к объекту ObservableDVD). У меня есть несколько кнопок, которые позволяют мне выполнять операции, о которых я говорил вам ранее. В заголовке событий кнопок я напрямую обновляю и изменяю объект ObservableDVD, а не его свойство Collection. Однако свойство Collection также отражает эти изменения.

Почему происходит такое поведение? Это нормально для меня, но я не могу понять, почему это происходит. Это из-за уведомлений?


person Alex_Ita    schedule 27.12.2012    source источник
comment
Я отредактировал ваш заголовок. См. Должны ли вопросы включать «теги» в свои заголовки?, если нет единого мнения, не следует.   -  person John Saunders    schedule 27.12.2012


Ответы (2)


Коллекция свойств имеет ссылку на представление ObservableDVD. Быть ссылкой означает указывать на одни и те же данные в памяти.

Класс ObservableCollection Представляет коллекцию динамических данных, которая предоставляет уведомления при добавлении элементов, удалены или когда весь список обновляется.

person Ralf de Kleine    schedule 27.12.2012
comment
Без проблем. Чтобы помочь другим принять ответ, который, по вашему мнению, лучше всего соответствует вашему вопросу. - person Ralf de Kleine; 27.12.2012

Указанная вами коллекция — это просто «представление» коллекции ObservableDVD. Это означает, что оба действительно указывают на одни и те же данные в памяти, это не две разные вещи. Например, «представление» может быть подмножеством элементов, когда вы применяете фильтры к коллекции.

Другими словами, ваш ObservableDVD содержит вашу «Таблицу данных» для всего набора данных, в то время как ICollectionView позволяет вам управлять тем, какие записи/объекты видны пользователю с помощью пользовательской логики.

person Joe    schedule 27.12.2012