MVVM - 调用控制方法

时间:2012-11-18 09:40:19

标签: c# wpf mvvm

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

“当然ViewModel没有关于视图的知识”?

如果您使用MVVM,则ViewModel 要注意View。

您可能需要查看RoutedCommandRelayCommand

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

示例:

PS:

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

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