WPF:如何在代码隐藏中没有代码的情况下将ViewModel中的事件发送到View?

Tom*_*fka 40 wpf events view mvvm viewmodel

我很简单(我希望:))问题:

在MVVM中,View通常会侦听ViewModel属性的更改.但是,我有时会喜欢听事件,例如,当VM发出信号时,View可以启动动画或关闭窗口.

通过带有NotifyPropertyChanged的bool属性(并且只有当它从false变为true时才开始动画)可以做到这一点,但感觉就像是一个hack,我更喜欢暴露事件,因为它在语义上是正确的.

此外,我想在代码隐藏中没有代码的情况下这样做,因为这样做viewModel.myEvent += handler意味着我已经手动取消注册事件以允许View为GC'd - WPF视图已经能够弱地监听属性',而且我更喜欢在View中以声明方式编程.

标准的强事件订阅也很糟糕,因为我需要为一个View切换多个ViewModel(因为每次创建View需要占用太多的CPU时间).

感谢您的想法(如果有标准的解决方案,msdn的链接就足够了)!

Ken*_*art 3

一些评论:

  • 您可以使用弱事件模式来确保视图可以被GC,即使它仍然附加到视图模型的事件
  • 如果您已经在一个视图中切换多个虚拟机,那么这不是附加/分离处理程序的理想位置吗?
  • 根据您的具体场景,您可以让虚拟机公开一个状态属性,视图将其用作动画、过渡和其他视觉变化的触发器。视觉状态管理器非常适合这种事情。

  • 好吧,想象一下您正在构建一个 Twitter 客户端,并且您希望在新消息到达时闪烁一些图标。会是什么样的状态呢?消息到达的那一刻可以发出事件信号,但它不会切换状态(如果您从“原始状态”切换到“新消息到达”,当另一批消息到达时,您将如何发出信号?)。它的语义是事件信号,而不是状态切换,我希望 WPF 能够尊重这一点...... (5认同)