【问题标题】:How to communicate from ViewModel to View如何从 ViewModel 到 View 进行通信
【发布时间】:2013-01-29 12:49:43
【问题描述】:

我的 ViewModel 上有一个名为 LostFocus 的属性,我希望 View 知道它何时发生变化,以便它可以根据需要对这些信息采取行动(即,如果设置了 LostFocus,视图的设计者可能会使其模糊为真,否则他们可能不会做任何事情)。

我使用的是 Caliburn.Micro,所以如果它有任何我应该在这里注意的功能,请告诉我。否则,您将如何以 MVVM 方式执行此操作?

【问题讨论】:

    标签: mvvm caliburn.micro


    【解决方案1】:

    据我了解,这可以通过普通数据绑定来完成。由于您使用的是 Caliburn.Micro,因此设计人员可以使用约定来进行绑定。例如,如果在 LostFocus 设置为 true 时要检查视图上的复选框控件,则设计人员只需确保复选框的 Name 属性设置为 LostFocus,然后 Caliburn 将设置自动绑定。

    另外,在您的视图模型上,确保在您更改 LostFocus 的值时引发属性更改通知事件。

    您也可以在视图模型上创建 LostFocus 事件,而不是使用 LostFocus 属性。然后,您可以在您认为合适的时候引发此事件,然后在视图上,设计人员可以使用事件触发器和触发操作来响应该事件。例如,在我的一个项目中,我设置了一个事件触发器来响应视图模型的 Activated 事件,然后我编写了一个自定义触发器动作来播放负责执行视图介绍动画的故事板。这种方法不限于 Caliburn.Micro,但我确实在 Caliburn.Micro 项目中使用过它,所以它确实有效。

    【讨论】:

    • 我想过,但是当我没有像 CheckBox 这样的特定控件来绑定它时该怎么办?我曾想过拥有一个无形的控制,如果有必要我可能会这样做,但它只会以你知道的错误方式摩擦我理想主义的一面。
    • 嗯,有几种方法可以解决这个问题:首先,如果您有一个要绑定的自定义控件,您可以制定自己的约定;其次,您可以只使用常规 WPF (非常规)绑定。
    • 是的,我明白了,但我想我坚持的是,在视图中添加一个我不需要的视觉元素似乎很奇怪。我想知道仅仅定义一个带有事件的接口并在我的 ViewModel 上实现它并让视图订阅它是否更有意义。
    • 当然。这最终取决于您设想设计师将如何实现您所说的模糊效果。他们可以创建另一个表示模糊效果的视觉元素,然后将其可见性属性绑定到您的视图模型上的 LostFocus(使用转换器将布尔值转换为可见性)。或者就像你说的那样,你可以发起一个他们可以订阅并运行故事板或其他东西的事件。
    • 从我刚刚添加的答案中可以看出,我最终选择了另一条路线,但 +1 表示好的想法。
    【解决方案2】:

    我最终了解了 BindingConverter 并使用它来将布尔属性 false 转换为 null 并将 true 转换为 BlurEffect。

    【讨论】:

    • 酷,在你提供的视图模型上给设计师一些灵活性总是好的,但老实说你可以不提供太多东西,因为ValueConverters 非常有用。不过老实说,LostFocus 听起来更像是一个设计问题,而不是你的 VM 应该处理的事情,尽管如果你的 VM 正在建模自定义控件或类似性质的东西,这将是非常有意义的
    • @Charleh 我有一个机制可以让插件在需要时显示一个窗口,如果他们这样做,我只是想让主窗口模糊。最终,我意识到我不需要 LostFocus 属性,因为我有一个名为 PluginContent 的 ContentControl,所以我只是绑定到它,我的值转换器只是检查它是否为空。
    • 绑定总是有办法的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多