Ловушка MVVM с помощью сценария Основной Детали

Или я не вижу решения, или я нашел ловушку в использовании 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 в Списке Деталей и незамедлительном обновлении на Представлении?

6
задан Bruno Bieri 1 September 2017 в 09:15
поделиться

1 ответ

Это всегда сложно при работе с видами «мастер-деталь». Однако одним из вариантов обычно является использование INotifyPropertyChanged и INotifyCollectionChanged и отслеживание их самостоятельно в ViewModel. Отслеживая эти свойства ваших объектов, вы можете правильно обрабатывать уведомления.

Я писал в блоге об аналогичной проблеме , когда я хотел, чтобы в «главном» списке происходила агрегация на основе значений в панели сведений (например: показывать общее количество заказов, которое всегда будет до настоящего времени). Проблемы идентичны.

Я поместил некоторый рабочий код в галерею кодов выражений , демонстрируя, как вы можете справиться с этим отслеживанием и сделать все актуальным в реальном времени, оставаясь при этом «чистым» с точки зрения MVVM.

4
ответ дан 17 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: