需要从ViewModel中调用视图的方法

时间:2012-04-30 14:02:10

标签: vb.net mvvm silverlight-5.0

我是Silverlight的新手,但在一些更为中级/高级的东西中,我很想听。

我在Silverlight 5中使用MVVM。

我有一个观点(我们称之为ComboView.xaml)。它有一个ViewModel(我们称之为AwesomeVM)

视图包含ViewModel,在页面的资源中声明如下:

<local:AwesomeVM x:Key="MyAwesomeVM" />

然后在DataContext中引用,如下所示:

<sdk:Page.DataContext>
    <Binding Source="{StaticResource MyAwesomeVM}"/>
</sdk:Page.DataContext>

视图在代码隐藏中有一个名为SetupPage的方法。 SetupPage作为参数接收其viewmodel类型(AwesomeVM)的实例,如下所示:

Public Sub SetupPage(ByVal VM As AwesomeVM)
    ...
End Sub

现在,问题出在这里:我需要从ViewModel中调用此SetupPage()。它似乎在之前加载页面,ViewModel能够获取它的任何数据(我假设这是因为ViewModel使用的是WCF Web服务,这是一个异步调用),所以SetupPage()的虚拟机没有数据,并且爆炸了。

有没有办法从ViewModel中调用视图的方法?

1 个答案:

答案 0 :(得分:1)

是啊..不要那样做。首先,页面知道它的数据上下文,因此不需要将数据上下文传递给该方法。其次,如果你不能将这个方法放在你的viewmodel中,并且需要将它放在视图中 - 也许是因为它对视图进行了一些直接操作 - 不要调用它直接。将其解耦,并使用消息传递来完成它。

大多数MVVM框架(例如MVVM Light)将提供一个轻量级的消息传递平台,允许您将方法从一个组件调用到另一个组件。例如,使用MVVM Light:

在您的网页代码隐藏中:

Messenger.Default.Register<SetupPageMessage>(this, SetupPage);

然后,在您的ViewModel中:

Messenger.Default.Send(new SetupPageMessage());

将在您的代码隐藏上执行SetupPage方法。有一些设置需要完全连线(比如创建一个SetupPageMes​​sage类,并在代码中创建适当参数化的SetupPage方法,但这应该是一个比你想象的更好(也更可测试)的方法。 / p>