В некоторых настраиваемых объектах у меня есть отношения "главный-деталь". Скажем, у меня есть следующая структура:
class Master : INotifyPropertyChanged
{
public int Id { get; set; } // + property changed implementation
public string Name { get; set; } // + property changed implementation
public ObservableCollection<Detail> Details { get; }
}
class Detail : INotifyPropertyChanged
{
public int Id { get; private set; }
public string Description { get; set; }
public double Value { get; set; } // + property changed implementation
}
Моя цель - иметь ListView, используя GridView, отображающий список основных объектов. Когда я выбираю конкретный мастер, у меня будет отдельный ListView для деталей, позволяющий редактировать. По сути, довольно стандартный вид Master-Detail.
Однако я также хочу, чтобы GridView для мастера отображал сумму всех элементов сведений этого мастера, то есть: Details.Select(d => d.Value).Sum();
Это довольно легко отобразить с помощью настраиваемого IValueConverter. Я могу преобразовать из коллекции деталей непосредственно в двойную отображаемую сумму и привязать текст TextBlock к объекту Details OneWay через IValueConverter. Это сработает и покажет правильные значения, когда я открою окно.
Однако, если я изменю один из элементов детали, это не будет обновляться (даже если деталь реализует INotifyPropertyChanged), поскольку сама коллекция остается прежней (ссылка ObservableCollection не изменилась).
Я хочу иметь агрегированное значение в главном списке, показывающее сумму (или среднее / количество / и т. Д.) В подробном списке, и чтобы это оставалось актуальным, когда пользователь изменяет свойства в деталях. Как я могу это реализовать?
Редактировать:
В идеале я бы предпочел, чтобы для этого существовали средства, не связанные с непосредственным изменением Мастер-класса. Рассматриваемое приложение использует шаблон MVVM, и я бы действительно предпочел не изменять свои классы модели, чтобы реализовать конкретное представление. Есть ли способ сделать это, не вводя в модель пользовательскую логику?