3

我正在寻找 MVVM 解决方案。视图中使用了一个控件(我们称之为 V)。该控件有一个方法 Foo()。该方法不能被事件调用,因为它的操作没有连接到控件的任何事件。我需要从 ViewModel 调用这个方法,但是 ViewModel 当然不知道视图。您对如何扩展 Control 以启用符合 MVVM 的 V.Foo() 调用有任何想法吗?

4

4 回答 4

2

我刚刚检查了我未接受的问题并找到了这个。
我记得我通过向控件添加ICommand依赖属性解决了这个问题,该控件使用OneWayToSource绑定,没有更新。Execute()调用将调用控件上的方法。

于 2014-10-14T12:05:58.227 回答
0

在这种情况下,我通常会使用 Messenger(例如 MVVMLight)/Mediator/EventAggregator(例如 Prism)模式来通知 View 它应该执行该方法。使用这种模式,您基本上可以从 VM 向某个收件人(在您的情况下为视图)发送消息,而不知道谁将处理它。因此视图模型不需要知道视图。

此外,此模式可用于创建可以处理我的许多收件人的通用广播消息,而发件人不知道其中任何一个。

例子:

PS:

这种方法有很多有效的案例。但是,必须说,如果有其他解决方案,应该避免从 ViewModel 调用 View。

对于那些批评从视图模型访问视图的人:请记住,MVVM 是通过提供替代方案来授权用户,而不是强加规则。

于 2012-11-18T11:34:41.740 回答
0

在视图模型中创建一个布尔值,它将向视图发出信号以执行操作。如果您有权访问该控件,请创建一个依赖属性,该属性可以绑定到上述布尔值并在更改时调用该方法。如果您没有能力编写依赖属性,请创建一个可以完成工作的行为。

于 2012-11-18T10:25:12.120 回答
0

“当然 ViewModel 对视图一无所知”?

如果你使用 MVVM,ViewModel必须知道 View。

您可能需要查看RoutedCommandRelayCommand

于 2012-11-18T09:51:16.160 回答