我是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中调用视图的方法?
答案 0 :(得分:1)
是啊..不要那样做。首先,页面知道它的数据上下文,因此不需要将数据上下文传递给该方法。其次,如果你不能将这个方法放在你的viewmodel中,并且需要将它放在视图中 - 也许是因为它对视图进行了一些直接操作 - 不要调用它直接。将其解耦,并使用消息传递来完成它。
大多数MVVM框架(例如MVVM Light)将提供一个轻量级的消息传递平台,允许您将方法从一个组件调用到另一个组件。例如,使用MVVM Light:
在您的网页代码隐藏中:
Messenger.Default.Register<SetupPageMessage>(this, SetupPage);
然后,在您的ViewModel中:
Messenger.Default.Send(new SetupPageMessage());
将在您的代码隐藏上执行SetupPage方法。有一些设置需要完全连线(比如创建一个SetupPageMessage类,并在代码中创建适当参数化的SetupPage方法,但这应该是一个比你想象的更好(也更可测试)的方法。 / p>