Xaml MVVM-在ViewModel的代码隐藏中调用UI逻辑

Xaml MVVM-在ViewModel的代码隐藏中调用UI逻辑,xaml,events,mvvm,viewmodel,code-behind,Xaml,Events,Mvvm,Viewmodel,Code Behind,我正在使用MVVM模式开发一些.NETXAML应用程序。 根据MVVM,我将应用程序逻辑保留在VM中,并在代码中执行与UI相关的操作。 但我需要在代码隐藏中执行一些与UI相关的代码,以响应VM中的一些逻辑 例如: 当登录操作失败时,我需要显示一条错误消息(在我的例子中是自定义toast通知)。登录操作驻留在VM中,但我不能在我的VM中使用任何特定于UI的类,所以我在VM中创建了一个事件,并在代码隐藏中连接到,执行UI操作 这是否违反了MVVM模式?如果是,那么如何解决我的问题?理想情况下,MVV

我正在使用MVVM模式开发一些.NETXAML应用程序。 根据MVVM,我将应用程序逻辑保留在VM中,并在代码中执行与UI相关的操作。 但我需要在代码隐藏中执行一些与UI相关的代码,以响应VM中的一些逻辑

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


这是否违反了MVVM模式?如果是,那么如何解决我的问题?

理想情况下,MVVM模式中视图和ViewModel之间的通信通过完成,以避免从VM中硬引用视图。有调解人,

  • 视图可以订阅特定类型的消息
  • 然后VM将消息发送给mediator
  • 调解人广播消息,所以所有订阅方都将获得该消息
  • 收到消息后,View可以根据消息执行特定的UI逻辑进行响应

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

    不要在代码隐藏中执行任何操作。您几乎可以绑定所有内容(对于某些复杂的内容)。或者是按钮单击,组合框选择更改。并尝试添加一些代码。请向我们展示您正在谈论的相关代码。如果您选择MVVMLight框架,您可以看到通过Thx中的Messenger(MVVMLight中中介器实现的类名)订阅和发送消息是多么简单,我将阅读有关中介器的内容,但是,在使用VM事件的情况下,没有可查看的硬链接。VM不关心谁确切地连接到事件,所以事件机制是某种简单的内置中介?抱歉,修复了链接。到目前为止,我看到中介是更常见的保存方法。对于使用VM事件方法的简单应用程序,可以接受并保存。但对于更复杂的场景,我们应该小心,因为这种方法将防止视图被垃圾收集,因为存在对来自VM事件的视图的引用。在使用Mediator的情况下,它不会阻止订阅方被垃圾收集]另一个优点是,Mediator也适用于VM到VM的通信,以防我们希望避免从一个VM到另一个VM的引用。简言之,中介帮助我们避免从一个类引用到另一个类,但仍然使我们能够以节省、弱引用的方式在它们之间进行通信