【问题标题】:MVVM - calling UI-logic in code behind from ViewModelMVVM - 在 ViewModel 后面的代码中调用 UI 逻辑
【发布时间】:2014-02-15 07:31:34
【问题描述】:

我正在使用 MVVM 模式开发一些 .Net XAML 应用程序。 根据 MVVM,我将我的应用程序逻辑保存在 VM 中,并在 Code Behind 我执行与 UI 相关的操作。 但是我需要在代码后面执行一些与 UI 相关的代码,以响应 VM 中的一些逻辑。

示例: 当登录操作失败时,我需要显示一条错误消息(在我的情况下是自定义 toast 通知)。登录操作驻留在 VM 中,但我不能在我的 VM 中使用任何特定于 UI 的类,所以我在 VM 中创建了一个事件,并在 Code Behind 中连接到,做 UI 工作。

是否违反了 MVVM 模式?如果是,那么如何解决我的情况?

【问题讨论】:

  • 不要在代码后面做任何事情。您可以绑定几乎所有东西(对于某些事情来说它很复杂)。要么是按钮单击,组合框选择已更改。
  • 并尝试添加一些代码。
  • 请给我们看一下你说的相关代码

标签: xaml events mvvm viewmodel code-behind


【解决方案1】:

在 MVVM 模式中,View 和 ViewModel 之间的理想通信是通过Mediator 完成的,以避免来自 VM 的硬引用 View。有调解员,

  1. View 可以订阅特定类型的消息。
  2. 然后VM将消息发送给中介,
  3. mediator 广播消息,所以所有订阅方都会收到。
  4. View收到消息后,可以根据消息执行一定的UI逻辑来响应

上面的 CodeProject 链接显示了如何实现中介类。但我建议使用popular MVVM framework,因为您会发现它具有 Mediator 实现和许多其他开箱即用的 MVVM 工具。

【讨论】:

  • 如果你选择了MVVMLight框架,你可以在this post看到通过Messenger(MVVMlight中的中介实现类名)订阅和发送消息是多么简单
  • 谢谢,我将阅读有关调解器的信息,但如果使用 VM 事件,则没有指向 View 的硬链接。 VM 不关心谁与事件完全挂钩,所以事件机制在这里是某种简单的内置中介?
  • 抱歉修复了链接。
  • 到目前为止,我看到 Mediator 是更常见和节省的方法。对于使用 VM 事件方法的简单应用程序可能可以接受并保存。但是对于更复杂的场景,我们应该小心,因为这种方法会阻止 View 被垃圾收集,因为 VM 事件中引用了 View。如果使用 Mediator,它不会阻止订阅方被垃圾收集[Reference]
  • 另一个优点是,Mediator 也适用于 VM 到 VM 通信,以防我们希望避免从一个 VM 到另一个 VM 的引用。简而言之,Mediator 帮助我们避免从一个类到另一个类的引用,但仍然使我们能够在它们之间进行通信 IN SAVE, WEAK-REFERENCE WAY
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
  • 2012-01-29
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2020-10-03
相关资源
最近更新 更多