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工作?
当使用主从视图时,这总是很困难。但是,一种选择通常是利用 INotifyPropertyChanged 和 INotifyCollectionChanged,并在 ViewModel 中自行跟踪它们。通过跟踪对象的这些属性,您可以正确处理通知。
我在博客中提到了一个类似的问题,我希望根据详细信息窗格中的值在“主”列表中进行聚合(即:显示订单总数,始终是最新的)。问题是相同的。
我在 Expression Code Gallery 上放置了一些工作代码,演示了如何处理此跟踪,并使所有内容实时保持最新,同时仍然保持 MVVM 术语中的“纯粹”。
| 归档时间: |
|
| 查看次数: |
3596 次 |
| 最近记录: |