【发布时间】:2010-12-26 01:04:46
【问题描述】:
我有一个很简单的(我希望:))问题:
在 MVVM 中,View 通常监听 ViewModel 属性的变化。但是,有时我想监听事件,例如,当 VM 发出信号时,View 可以启动动画或关闭窗口。
通过带有 NotifyPropertyChanged 的 bool 属性(并且仅当它从 false 变为 true 时才开始动画)是可能的,但感觉就像一个 hack,我更喜欢公开事件,因为它在语义上是正确的。
另外,我想在代码隐藏中没有代码的情况下这样做,因为这样做 viewModel.myEvent += handler 意味着我必须手动取消注册事件以允许 View 被 GC'd - WPF 视图已经能够'弱'地监听属性,我更喜欢仅在 View 中以声明方式编程。
标准的强事件订阅也不好,因为我需要为一个View切换多个ViewModel(因为每次创建View都占用了太多的CPU时间)。
感谢您的想法(如果有标准解决方案,指向 msdn 的链接就足够了)!
【问题讨论】:
-
Propertychanged 是一个事件。在触发器中监听 bool 属性在语义上是不正确的?
-
我真的不明白为什么人们在视图中如此反对代码隐藏。视图响应属性的原因是代码隐藏中的代码,它只是隐藏在框架中。
-
adrianm:我尝试在 VM 中创建始终为 false 的 bool 属性,并在其上提高 OnPropertyChanged,但 View 没有反应 - 似乎 WPF 只有在实际值发生变化时才会执行某些操作。所以我需要打开和关闭那个 bool,MyProp = true; OnPropertyChanged("MyProp");我的道具=假; OnPropertyChanged("MyProp"); - 而不是 RaiseMyEvent()。看到了吗?
-
Cameron:因为在View中订阅事件是强耦合的,为了不造成内存泄漏而弱做这件事真的很棘手。此外,我们有时会在开发过程中使用多个视图(尝试使用 GUI 的替代方法),并且保持它们的代码隐藏同步将是不必要的维护负担。也可以通过为示例数据分配匿名类型来测试 View,这对于强类型代码隐藏会更加困难。
-
我使用虚拟机通过 IView 接口感知视图的原理。我会在界面中使用启动动画的方法来解决它。
标签: wpf mvvm events view viewmodel