ViewModel操纵View的最佳方法是什么?

时间:2009-05-28 11:42:31

标签: wpf mvvm

我理解在MVVM模式中, ViewModel应该对View 一无所知。

因此,似乎两种方式,ViewModel可以导致某些特定内容在UI上发生,请考虑这种常见的事件流:

  • 用户在文本框中输入内容
  • 用户点击按钮
  • 按钮在viewmodel上调用名为“保存”的DelegateCommand
  • 视图模型从文本框中保存文本
  • 如果保存期间一切顺利,视图模型会将名为 SaveStatus 的INotifyPropertyChanged属性更改为“成功”

现在在视图中,我有两种方法可以允许此更改对用户界面产生影响

  • 在视图中可能有一个Textblock,其上有转换器,可将 SaveStatus 的文本转换为“保存成功。”等短语。 LI>
  • 在视图中可能有一个触发器,它会检查 SaveStatus =“成功”,如果是,那么一系列Setter会相应地更改UI(隐藏元素,改变文本,改变颜色等。)

这是您在应用程序中使用的从ModelView到View <的基本信息流吗?

3 个答案:

答案 0 :(得分:1)

您还可以在viewmodel上创建自定义事件,并让视图订阅它们并做出相应的反应。您不应该经常这样做,但它比检查特定属性名称的每个INotifyPropertyChanged事件更有意义。

答案 1 :(得分:0)

我们正在使用模型视图控制器模式,所以它是这样的:

  • 用户在文本框中输入内容
  • 用户点击保存按钮
  • 视图告诉控制器保存数据
  • 控制器告诉视图获取数据
  • 控制器将数据保存到模型
  • 控制器发出保存成功的视图
  • 视图显示“保存已成功”

我认为你可以使用几乎相同的方法(唯一的区别是控制器和模型都是你的例子中的视图模型)

答案 2 :(得分:0)

  

这是您在应用程序中使用的从ModelView到View的基本信息流吗?

是。我们几乎只使用INotifyPropertyChanged来实现从ViewModel到视图的更改。在交互稍微复杂的地方,我们使用View连接的其他事件。

我们在EditableAdapter上有一个HasChanges布尔值,而不是SaveStatus消息属性,它包装我们的POCO并提供更改的提交/回滚,以及其他计算属性。然后我们可以将Views绑定到这个HasChanges,这样,例如,我们可以在末尾显示带有*的文档名称以显示它有更改,或者使用HasChanges来禁用/启用Save按钮。