根据模式,ViewModel公开View绑定到的Properties(带有更改通知)和Commands(用于通知VM用户操作)。 从VM流向View的唯一通信是属性更改通知(以便View可以使用更新的数据刷新自身)。
在模式的MVP或PresentationModel形式中(如果我没有弄错),View实现了一个普通的vanilla接口(由方法,属性和/或事件组成)。使用MVVM,感觉IView上的方法已被取缔(与IView本身一起)。
我能想到的一个场景是将焦点设置为View中的某个控件。 (当用户执行ActionX时,焦点应立即设置为FieldY )。
以上只是常态的例外吗?还是有其他这样的场景,VM需要在View上调用方法吗?
答案 0 :(得分:1)
虽然不鼓励ViewModel在视图上调用实际方法,但有些情况下能够调用视图操作是有益的。大多数MVVM从业者提倡使用mediator pattern来处理VM以查看通信的消息传递系统,如果您查看MVVM框架(例如MvvmFoundation),您通常可以看到此类信使系统的示例
对于我自己,我发现最常见的情况是我需要做的就是使用焦点操作,因为经常使用XAML将注意力集中在正确的元素上可能会很难设置,并且能够做某事简单就像......
Messenger.Notify("SetFocusOnElement");
可以派上用场。
答案 1 :(得分:0)
每当您感到被迫使用代码隐藏时,您可能会以创建可在XAML中以声明方式使用的通用,可重用控件或类的方式重构它。在您的情况下,您可以提出自己的FocusListener
课程等,以便您可以写下:
<TextBox Text="{Binding SomeStuff}" myCtl:FocusListener.FocusWhen="{Binding SomeStuff}" />
这肯定取决于您的方案,如果这种方法可以帮助您。
使用你自己的一些扩展WPF的可用类和控件肯定不是禁止的。
答案 2 :(得分:0)
为什么不允许MVVM模式通过接口与View通信?
在MVP中,我将其写为IView.ActivateField(NameConstant),演示者或PM将调用它。
当Interface方法很简单并且没有任何缺点(例如可测试性)时,我不会开始实现复杂的解决方法。
可在此处找到更多信息: WPF Application Framework (WAF) 。