c# - 使用 MVVM 管理可取消的部分更新

标签 c# wpf design-patterns mvvm

我是 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/

相关文章:

c# - 拖放项目以构建图表

c# - Web 服务器性能/测试工具

c# - .Net 4.0 中的点程序集引用,似乎无法找到它

c# - 作为服务定位器的通用静态类

c# - 如果 itemsource 中不存在值,则 Combobox 分配 null

c# - 即使分配了 null,sql 也不会返回值

c# - 如何使用自动增量列 SQLite 插入行

.net - WPF 列表框 + 绑定(bind) + IDataErrorInfo =?

java - 仅包含具有内部状态的静态成员的类

REST API 处理错误的最佳实践