gpt4 book ai didi

.net - 使用 Master-Detail 场景的 MVVM 陷阱

转载 作者:行者123 更新时间:2023-12-04 15:27:58 24 4
gpt4 key购买 nike

要么我没有看到解决方案,要么我发现了使用 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 客户通过 ...="{Binding Customers}"绑定(bind)到 View ,并且当客户从用户更改时,相关订单通过 ItemsSource="{Binding SelectedItem.Orders 显示在 DataGrid 中, ElementName=comboboxCustomer}”。

这可以通过 MVVM 实现:

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

添加后我这样做: this.RaisePropertyChanged("Customers"); .这将更新 View 并立即在客户组合框中显示客户。

现在来了 MVVM 不可能的部分。

我可以通过 SelectedCustomer.Orders.Add(New Order(){...}); 添加新订单

但是我 不能像以前一样在 Orders 上与现在的客户一起引发 CollectionChanged/PropertyChanged 事件,因为 Orders 属性未通过公共(public)访问器绑定(bind)到 View 。

即使我将 Orders 可绑定(bind)属性公开给 View , View 本身也关心 Master-Detail 切换而不是 ViewModel...

问题

如何使 Master-Detail 与 Details-List 中的 Add/Del 对象一起工作并在 View 上立即更新?

最佳答案

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

blogged about a similar issue ,我希望根据详细信息 Pane 中的值在“主”列表中进行聚合(即:显示订单总数,这将始终是最新的)。问题是相同的。

我放了一些 working code up on the Expression Code Gallery演示如何处理这种跟踪,并使所有内容实时保持最新状态,同时在 MVVM 术语中仍然保持“纯”。

关于.net - 使用 Master-Detail 场景的 MVVM 陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2348723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com