2016-09-01 1 views
1

Скажем, у меня есть основной класс базы данных, TvShowDatabase, который содержит список Shows. Каждый Show имеет список Episodes, каждый из которых имеет Length. Объекты TvShowDatabase, Show и Episode все оснащение INotifyPropertyChanged.Вычисление агрегатов связующих объектов в WPF?

Я хотел бы, чтобы вычислить и показать TotalViewingPotential, свойство TvShowDatabase, который суммирует Length каждого Episode каждого Show.

Кроме того, предположим, что пользователь смотрит на эту структуру в древовидном стиле и может редактировать Length любого Show. Когда они это делают, TotalViewingPotential должен соответственно обновиться, и результаты будут видны на экране.

Мой вопрос: в WPF (и, в частности, с использованием Prism для MVVM), как лучше всего подключить сантехнику для этих уведомлений об изменениях?

Я посчитал, что перехватывает добавления к каждому списку (с использованием ObservableCollection) и дает любые новые позиции Parent. Это, однако, становится беспорядочным, и подход сверху вниз является предпочтительным.

Я видел гипер-наблюдаемые коллекции (http://www.codeproject.com/Tips/694370/How-to-Listen-to-Property-Chang), но я беспокоюсь о утечке памяти на основе подписки на события, используя этот метод, и по-прежнему требуется хорошая ручная сантехника, чтобы поднять события OnPropertyChanged(TotalViewingCollection) там, где это необходимо.

Есть ли шаблон для этого?

+0

Возможно, вы захотите изучить Reactive Extensions для .NET, к сожалению, я только начал смотреть на него, поэтому я не чувствую себя комфортно, давая вам советы об этом –

ответ

0

Задача, как вы ее описали, имеет простое решение. Вам не нужно распространять изменения по коллекциям.

TotalViewingPotential - это нормальное свойство INotifyPropertyChanged. Сделайте его доступным из свойств Length.

В настройщике свойства Length вычислите разницу между новым и старыми значениями и увеличьте значение TotalViewingPotential на разницу.

Это все.

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