【问题标题】:What is the best way for the ViewModel to manipulate the View?ViewModel 操作 View 的最佳方式是什么?
【发布时间】:2009-05-28 11:42:31
【问题描述】:

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

因此,ViewModel 似乎有两种方式可以在 UI 上导致特定的事情发生,请考虑以下常见的事件流:

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

现在在视图中,我有两种方法可以让这种更改对 UI 产生影响

  • 在视图中可能有一个文本块,上面有一个 Converter,它将 SaveStatus 的文本转换为诸如“保存成功”之类的短语。李>
  • 在 View 中可能有一个 Trigger 检查是否 SaveStatus = "Succeeded",如果是,则一系列 Setter 会适当地更改 UI(隐藏元素、更改文本、更改颜色等)

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

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      是的。我们使用 INotifyPropertyChanged 几乎专门用于从 ViewModel 到视图的更改。在交互更复杂的地方,我们使用 View 连接的其他事件。

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-06-29
          • 2012-12-22
          • 2014-02-12
          • 2010-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多