是否存在ViewModel需要在View w.r.t上调用方法的情况。 WPF中的MVVM?

时间:2010-04-02 06:36:35

标签: wpf mvvm

根据模式,ViewModel公开View绑定到的Properties(带有更改通知)和Commands(用于通知VM用户操作)。 从VM流向View的唯一通信是属性更改通知(以便View可以使用更新的数据刷新自身)。

在模式的MVP或PresentationModel形式中(如果我没有弄错),View实现了一个普通的vanilla接口(由方法,属性和/或事件组成)。使用MVVM,感觉IView上的方法已被取缔(与IView本身一起)。

我能想到的一个场景是将焦点设置为View中的某个控件。 (当用户执行ActionX时,焦点应立即设置为FieldY )。

  • 在MVP中,我将其写为IView.ActivateField(NameConstant),演示者或PM将调用它。
  • 在MVVM中,这似乎是一个需要解决方法/一点点代码隐藏的边缘情况。 VM实现一个ActiveField属性,它设置为NameConstant。视图选择更改通知事件,并在代码隐藏事件处理程序中激活名称控件。

以上只是常态的例外吗?还是有其他这样的场景,VM需要在View上调用方法吗?

3 个答案:

答案 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)