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

Managing Cancelable Partial Updates using MVVM

我是 MVVM 的新手,在转换大型非模型视图 WinForms 项目时,我正在尝试建立良好的实践。这是我实施的解决方案的示例。我想知道是否有更好的模式来解决这个 class 的问题。

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 使用数据绑定连接到 MyViewModel。

模型->查看数据流汇总: MyModel 在 MyTempModel 中设置 属性,这会触发一个事件。 MyViewModel 的 evenhandler 获取更改并设置依赖项 属性,导致 MyView 更新。

查看 -> 模型数据流摘要: 对 MyView 的更改导致 MyViewModel 中的依赖项 属性 发生更改。 属性 的 setter 将值推送到 MyTempModel。当用户单击“确定”时,MyModel 会从 MyTempModel 复制值。

我对 ViewModel 的作用特别感兴趣。我记得保持对话 "humble" 是一件好事,也许这会影响到让 ViewModels 变得谦逊。因此,关于您在视图模型和领域模型中添加了哪些功能的评论会特别有趣。

我很欣赏这种模式的所有设计智慧。如果有人需要澄清,我很乐意更新此信息。

Alex 给出的方向的替代方法是使视图模型代表客户端和服务器端的内容。

例如,显示的号码始终是用户输入的号码,号码的背景表示该号码是否已被服务器确认(待定)。视图模型可以使用两个不同的属性来包含这些值和状态 属性 来指示 属性 已同步的事实。

通过这种方式,视图模型可以捕获用户需要知道的所有信息。视图需要做的就是绑定到正确的属性以进行显示和编辑。

我不认为使用代理 class 是件坏事。我有点担心这一点:'MyModel sets property in MyTempModel, which fires an event. MyViewModel’s evenhandler picks up the change and sets a dependency property, causing MyView to update.' 我认为这会使您的模型 class 变得不那么通用,并从 ViewModel 中掩盖了该功能。我只想使用 ViewModel 来调解代理的交换 in/out,而不是让模型来做。我还认为使用代理打开了该类型的 DataTemplates 的使用,这可以使 UI 工作更容易。