![]() |
1
5
我不使用ViewModel打开另一个View/ViewModel。这是管制员的责任。ViewModel可以通知控制器(例如,通过事件)用户希望看到下一个视图。控制器在IoC容器的帮助下创建视图/视图模型。 其工作原理显示在 WPF Application Framework (WAF) . |
![]() |
2
13
我更喜欢使用通过ViewModel构造函数插入的操作委托。这也意味着我们可以在单元测试期间轻松验证:
|
![]() |
3
3
使用中介模式,如mvvmlight的messenger类: http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338 基本思想是viewmodel向其视图发送消息。接收视图如下所示:
这允许发送消息的viewmodel显示另一个窗口,而不知道是如何打开的,也不知道是谁打开的。 |
![]() |
4
2
我个人更喜欢在ViewModel中引发事件,以向视图发出信号,表明它需要执行诸如打开窗口之类的操作。不过,我尽量不直接这样做,这样就不会在ViewModel中看到类似OpenWindow的事件,因为在我看来,这似乎违反了视图和ViewModel之间的分隔。相反,我可能要做的是使用一个属性来更改状态,并相应地引发一个PropertyChanged事件,在该事件中,视图可以侦听,然后决定打开一个窗口来响应此信号。在某些情况下,窗口的打开与ViewModel中的某些内容完全不相关,只是视图的一个功能。在这些情况下,我一点也不怕在视图的代码隐藏部分中放置用于打开另一个视图的代码。 这个 mediator pattern 只需使其更松散地耦合,并允许主应用程序窗口视图或高度嵌套的视图可以在应用程序中全局侦听消息,而无需直接访问ViewModels以附加事件处理程序等。若要筛选出不相关的消息,可以查看某种消息源值或消息来源的其他指示。对于那些熟悉Windows消息以及如何在非托管和WinForms开发中的不同控件(Windows)之间工作的人来说,理解系统可以建立在广播消息的中介之上。 |
|
5
0
我同意类似中介的方法,但是OnMsgReceived显然是在视图的代码背后处理的,有没有好的方法来避免这种情况? |
|
Sei · Avalonia/WPF将路由器传递到控制模板 5 月前 |
![]() |
Barta · WPF MVVM不更新视图 6 月前 |
![]() |
Denis Ivanov · WPF控件在属性更改时不会更新 6 月前 |
![]() |
codymanix · WPF:TextBlock周围可见小边框? 6 月前 |
![]() |
Nostromo · 来自背景对象的工具提示 10 月前 |
![]() |
Nuvolari · 从可观测集合添加/删除时出现对象处理异常 1 年前 |
![]() |
CCarter · 只能在设计器中DependencyObject的DependencyProperty上设置显示“Binding”的WPF ICommand DependencyProperties[重复] 1 年前 |
![]() |
Thern · 在UI线程(WPF)上的void方法中调用异步函数 1 年前 |