【发布时间】:2012-01-14 05:34:24
【问题描述】:
我正在与WPF+MVVM 合作。
我有一个VM,其中包含一个Customer 属性。 Customer 有一个 ObservableCollection 或 Orders。每个Order 都有一个ObservableCollection 或Items。每个Items 都有一个Price。
现在,我的VM 上有以下属性:
public double TotalPrice
{
return Customer.Orders.Sum(x => x.Items.Sum(y => y.Price));
}
问题在于,无论何时在此对象图中的任何点发生更改 - 都应通知 UI TotalPrice 已更改 - 但它没有...
例如,如果Customer将从A更改为B,或添加订单,或删除商品,或更改商品价格等。
有人对此有一个优雅的解决方案吗?
谢谢。
【问题讨论】:
-
这些对象的变化来自哪里?是否存在某种分层 GUI 布局并且用户正在修改订单?还是这些更改来自持久性/域/其他非 GUI 来源?
-
嗨 Erik,这些变化来自 UI 本身,这意味着用户可以更改商品的价格、添加/删除商品、添加/删除订单等。
-
在这种情况下,我会说 sll 有一个很好的解决方案。 VM 可以侦听 Orders 和 Items 上的集合更改事件,并且该处理程序可以引发 TotalPrice 上的属性更改。至于价格被改变,你还需要监听 Item.Price 上的属性改变,它的处理程序也会提高属性改变的总数。
-
嗨,Eirk,您还应该看看 ItzikSaban 给我的解决方案,因为它似乎包含了您刚才提到的所有逻辑。
-
根据我的口味,接线有点重,但这是一个有趣的概念。我个人使用 NotifyChange(Expression
> propertyExpression) 范例,它允许您调用 NotifyChange(() => PropertyName)。如果你然后参数化它,你可以做 NotifyChange(() => Prop1, () => Prop2, etc)。 Itzik 解决方案的流畅界面很酷,但我不知道我是否想在 VM 的构造函数中为用户可能永远不会调用的属性执行所有这些连线工作。不过,也许我会自己尝试一下,然后变得更喜欢它。
标签: c# wpf data-binding mvvm observablecollection