首页 新闻 会员 周边 捐助

MVVM 模式下,编辑对象点击取消按钮,该如何还原列表中的数据?

0
悬赏园豆:5 [待解决问题]

大家好,我在使用silverlight MVVM模式时,遇到一些问题:

 

1.我做了一个增删改查用户(User)的模块,使用的是WCF,而不是WCF ria,

2.首先,我建立了一个页面(UserList.xaml),在UserList.xaml页面中,放了一个DataGrid用于列出所有用户(User),

3.然后点击某个用户前面的“修改”按钮,将弹出修改用户页面窗口(UpdateUserWindow.xaml),

4.由于采用的 MVVM 模式,我在ViewModel中建了一个SelectedUser的属性,该属性双向绑定DataGrid中的SelectedItem属性,弹出的UpdateUserWindow窗口中,所有的控件双向绑定ViewModel中的SelectedUser的各个属性(比如用户名,电话等),这样在UpdateUserWindow中更改各个字段,UserList页面的DataGrid中的数据也可以看到实时的更改,

5.但如果用户改完数据后点击“取消”按钮关闭UpdateUserWindow话,UserList页面的DataGrid中的数据已经被更改了(虽然没有提交到数据库),

 

怎样避免这个问题??

~冻结~的主页 ~冻结~ | 初学一级 | 园豆:39
提问于:2013-08-16 12:04
< >
分享
所有回答(1)
0

很简单, UpdateUserWindow.xaml 绑定到 SelectedItem 的副本,只有当点击确定时,才将此被修改过的副本付给 SelectedItem。

Launcher | 园豆:45050 (高人七级) | 2013-08-16 13:05

多谢回答,

 

目前我就用的是这种方案,但我修改的对象比较复杂,有几个嵌套对象,还有集合对象,一个一个复制感觉很别扭,我感觉我用mvvm的方式不对,不知大家是怎么用的??

支持(0) 反对(0) ~冻结~ | 园豆:39 (初学一级) | 2013-08-16 13:42

@jesse hao: 你可以为每个 ViewModel 实现原型模式,即 Clone 方法,你的复制就简单多了。如果是 MVVM 的话,这是比较简单的方式, Prism 中的 StockTraderRI 中的 Order Edit View 就是这样做的,它创建了一个 OrderEditViewModel。

其实,我们抛开UI来看,你有一个对象,你想修改此对象,同时还想拥有撤销的功能,那么一种方式就是 Clone 一个新对象,在新对象上做修改;另一种方式,就是采用命令模式来记录对对象的某个属性的更改,然后调用 SaveChanges 时才将这些修改命令应用到该对象上。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2013-08-16 14:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册