我有一个数据网格,它绑定到实现INotifyPropertyChanged的Item对象。MVVM Datagrid从视图和模型更新
在ViewModel中,我订阅了来自更新Item对象的外部设备服务的更改。 datagrid是可编辑的,因此Item也可以从View中更改。该值应写入设备,但尚未在视图中更新,因为设备写入可能会失败。如果成功,设备将发出一个我已经订阅的事件。
我的一些担忧是。
我在哪里可以通过ViewModel或Item对象在设备服务上调用写入? 如何确保数据网格中显示的值在编辑后“恢复”,直到从设备接收事件?
的几点思考
如果它的项目对象,然后Item对象不再是DTO,而是一个ViewModel我猜。所以我会为同一视图(用户控件)提供两种视图模型。一个用于用户控件,另一个用于数据网格中的项目。这不符合我对视图模型的理解。但也许这是错的? 然后Item如何知道值是从视图(由用户)还是由视图模型(由设备服务)更新?
ViewModel订阅Item对象上的PropertyChanged。要检测值是否从视图中更改,ViewModel可以从服务中取消订阅PropertyChanged或设置标志。它似乎很笨重,但会起作用。 也许我应该做两个属性:ViewValue和ServiceValue。 ViewModel应该更新ServiceValue并订阅ViewValue,它可以在阅读ViewValue之后将ViewValue还原为ServiceValue。
视图处理CellEditEnding并通知视图模型
IEditableObject听起来不错,我会看看它。关于第1点,也许我还不够清楚。我担心的是,对于“相同”视图,我可能有两个视图模型,一个用于窗口,另一个用于窗口中数据网格的项目。我在想一个viewmodel属于一个window/usercontrol,而不是一个数据网格中的项目。但也许我的想法是错误的? – Karsten
您也可以实现'你们哪绑定到'DataGrid'实体名单IEditableObject'接口。它会给你更多的灵活性。 –
Hmm interresting将DataGrid放入用户控件中。我喜欢清晰的名字,所以我想知道你是如何命名用户控件和视图模型的? – Karsten