【发布时间】:2012-01-19 05:51:04
【问题描述】:
我有一个数据网格,它绑定到一个实现 INotifyPropertyChanged 的 Item 对象。
在 ViewModel 中,我订阅了来自外部设备服务的更改,该服务更新了 Item 对象。 数据网格是可编辑的,因此项目也可以从视图中更改。该值应写入设备,但尚未在视图中更新,因为设备写入可能会失败。如果成功,设备会发出一个我已经订阅的事件。
我的一些担忧是。
我应该从 ViewModel 还是从 Item 对象调用设备服务上的 write? 如何确保数据网格中显示的值在编辑后“还原”,直到接收到来自设备的事件?
一些想法
如果它是 Item 对象,那么 Item 对象不再是 DTO,而是我猜的 ViewModel。所以我将有两个视图模型用于同一个视图(用户控件)。一个用于用户控件,一个用于数据网格中的项目。这不符合我对视图模型的理解。但也许是错的? 那么 Item 如何知道值是从视图(由用户)还是从视图模型(由设备服务)更新的?
ViewModel 订阅 Item 对象的 PropertyChanged。要检测 View 的值是否已更改,ViewModel 可以在从服务获取事件时取消订阅 PropertyChanged 或设置标志。它看起来很笨拙,但会起作用。 也许我应该创建两个属性:ViewValue 和 ServiceValue。 ViewModel 应该更新 ServiceValue 并订阅 ViewValue,它可以在读取 ViewValue 后将其恢复为 ServiceValue。
View 处理 CellEditEnding 并通知视图模型
【问题讨论】: