使用Master-Detail场景的MVVM陷阱

msf*_*boy 6 .net mvvm master-detail

要么我没有看到解决方案,要么我在使用MVVM时遇到了陷阱.

我有这个样本Master-Detail:

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}
}
Run Code Online (Sandbox Code Playgroud)

让我们在CustomerOrdersViewModel中假设我的ObservableCollection客户绑定到View via ... ="{Binding Customers}",当客户从用户更改时,相关订单通过ItemsSource ="{Binding SelectedItem.Orders"显示在DataGrid中,ElementName = comboboxCustomer}".

这可以通过MVVM实现:

我可以简单地(为了简单起见)调用添加新客户Customers.Add(new Customer(){...});.

添加后我这样做:this.RaisePropertyChanged("Customers");.这将更新视图并立即在Customer-Combobox中显示客户.

现在是MVVM不可能实现的部分.

我可以添加一个新的Order by SelectedCustomer.Orders.Add(New Order(){...});

但是我现在无法像订单上的客户那样提出CollectionChanged/PropertyChanged事件,因为订单属性未通过公共访问者绑定到View.

即使我将Orders bindable属性暴露给视图,视图本身也会关注Master-Detail切换而不是ViewModel ......

如何使用详细信息列表中的添加/删除对象以及在视图上立即更新来使Master-Detail工作?

Ree*_*sey 4

当使用主从视图时,这总是很困难。但是,一种选择通常是利用 INotifyPropertyChanged 和 INotifyCollectionChanged,并在 ViewModel 中自行跟踪它们。通过跟踪对象的这些属性,您可以正确处理通知。

在博客中提到了一个类似的问题,我希望根据详细信息窗格中的值在“主”列表中进行聚合(即:显示订单总数,始终是最新的)。问题是相同的。

在 Expression Code Gallery 上放置了一些工作代码,演示了如何处理此跟踪,并使所有内容实时保持最新,同时仍然保持 MVVM 术语中的“纯粹”。