1

我是 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 接收其视图模型类型 (AwesomeVM) 的实例作为参数,如下所示:

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

现在,问题来了:我需要从 ViewModel 中调用此 SetupPage()。它似乎在 ViewModel 能够获取其任何数据之前加载页面(我认为这是因为 ViewModel 使用 WCF webservice,这是一个异步调用),因此 SetupPage() 的 VM 没有数据,并炸毁。

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

4

1 回答 1

1

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

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

在您页面的代码隐藏中:

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

然后,在您的 ViewModel 中:

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

将在您的代码隐藏上执行 SetupPage 方法。需要进行更多设置才能完全连接(例如创建 SetupPageMes​​sage 类,并在代码中创建适当参数化的 SetupPage 方法,但这应该是比您想象的更好(且更可测试)的方法。

于 2012-04-30T14:41:04.253 回答