我是 MVVM 的新手,在转换大型非模型 View WinForms 项目时,我正在尝试建立良好的实践。这是我实现的解决方案的示例。我想知道是否有更好的模式来解决这类问题。
MyModel 有十个属性。 MyView 公开其中两个供用户更新。 MyViewModel 处理介于两者之间的常见内容。
其他模型依赖于 MyModel 的属性,所以我只想在值被提交时更改 MyModel。 MyView 有确定和取消按钮,所以当用户与 MyView 交互时,我没有让 MyViewModel 直接更新 MyModel,而是创建了另一个层:MyTempModel。 MyTempModel 包含两个属性,对应于 MyModel 中的两个属性。
所以在 MyModel 中,提示代码看起来像这样:
var tempModel = new TempModel{Prop1=Prop1,Prop2=Prop2};
bool? response = new MyView().ShowDialog();
if (response.HasValue && response.Value)
{
Prop1 = tempModel.Prop1
Prop2 = tempModel.Prop2
}
因此,如果用户单击“取消”,MyModel 的属性不会更改。 注意:此处未显示的是我在 MyViewModel 中设置了对 MyTempModel 的引用以建立该连接。 MyViewModel 订阅 MyTempModel 中的属性更改事件,MyView 使用数据绑定(bind)连接到 MyViewModel。
模型->查看数据流汇总: MyModel 在 MyTempModel 中设置属性,这会触发一个事件。 MyViewModel 的 evenhandler 获取更改并设置依赖属性,导致 MyView 更新。
查看->模型数据流总结: 对 MyView 的更改会导致 MyViewModel 中的依赖属性发生更改。此属性的 setter 将值推送到 MyTempModel。当用户单击“确定”时,MyModel 会从 MyTempModel 复制值。
我对 ViewModel 的作用特别感兴趣。我认为让对话框保持“谦逊”是一件好事,也许这会影响到让 ViewModels 谦逊。因此,关于您在 View 模型和域模型中添加了哪些功能的评论会特别有趣。
我很欣赏这种模式的所有设计智慧。如果有人需要澄清,我很乐意更新此信息。
最佳答案
我不认为使用代理类是一件坏事。我有点担心这个:'MyModel 在 MyTempModel 中设置属性,这会触发一个事件。 MyViewModel 的 evenhandler 获取更改并设置依赖属性,导致 MyView 更新。我认为这会使您的模型类的通用性降低一些,并使 ViewModel 的功能变得模糊。我只会使用 ViewModel 来调解代理的换入/换出,而不是让模型来做。我还认为使用代理打开了该类型的 DataTemplates 的使用,这可以使 UI 工作更容易。
关于c# - 使用 MVVM 管理可取消的部分更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29481271/