Или я не вижу решения, или я нашел ловушку в использовании MVVM.
У меня есть эта демонстрационная Основная Деталь:
class Customer
{
int CustomerID {get;set}
string Name {get;set}
ObservableCollection<Order> Orders {get;set}
}
class Order
{
int OrderID {get;set}
int Quantity {get;set}
double Discount {get;set}
}
Позволяет принимают в моем CustomerOrdersViewModel, через который мои Клиенты ObservableCollection связываются с Представлением... = "{Привязка Клиентов}" и когда клиент изменяется от пользователя, имеющие отношение Заказы показывают в DataGrid через ItemsSource = "{Привязка SelectedItem. Заказы, ElementName=comboboxCustomer}".
Это возможно с MVVM:
Я могу добавить нового Клиента просто (для пользы простоты) вызов Customers.Add(new Customer(){...});
.
После добавления я делаю это: this.RaisePropertyChanged("Customers");
. Это обновит представление и сразу покажет Клиенту в Клиентском поле комбинированного списка.
Теперь прибывает невозможная часть с MVVM.
Я могу добавить новый Порядок SelectedCustomer.Orders.Add(New Order(){...});
НО я не могу сгенерировать событие CollectionChanged/PropertyChanged как прежде с Клиентами теперь на Заказах, потому что Свойство Заказов не связывается с Представлением через общедоступное средство доступа.
Даже если я подверг бы Заказы связываемое свойство представлению, само представление заботится о переключении Основной Детали не ViewModel...
ВОПРОС
Как возможно заставить Основную Деталь работать с объектами Add/Del в Списке Деталей и незамедлительном обновлении на Представлении?
Это всегда сложно при работе с видами «мастер-деталь». Однако одним из вариантов обычно является использование INotifyPropertyChanged и INotifyCollectionChanged и отслеживание их самостоятельно в ViewModel. Отслеживая эти свойства ваших объектов, вы можете правильно обрабатывать уведомления.
Я писал в блоге об аналогичной проблеме , когда я хотел, чтобы в «главном» списке происходила агрегация на основе значений в панели сведений (например: показывать общее количество заказов, которое всегда будет до настоящего времени). Проблемы идентичны.
Я поместил некоторый рабочий код в галерею кодов выражений , демонстрируя, как вы можете справиться с этим отслеживанием и сделать все актуальным в реальном времени, оставаясь при этом «чистым» с точки зрения MVVM.