如何在MVVM中的两个视图之间传递Model对象(在视图中完成数据绑定)

时间:2010-07-01 02:01:50

标签: silverlight mvvm windows-phone-7

我正在使用silverlight对windows phone 7应用程序进行原型设计。我试图在我的应用程序中使用MVVM模式。我有以下情况:

我使用NavigationService.Navigate(“下一页的uri”)方法从一个view1(页面)导航到另一个view2(页面)[请注意NavigationService是一个密封类,因此无法覆盖]。基本上,在View1导航到View2之前,View2不会初始化。

我将View1和View2绑定到同一个ViewModel。因此,app启动 - 启动View1和ViewModel并获取反序列化的对象。在获取此反序列化对象时,ViewModel向View1发送消息以导航到View2(它也绑定到相同类型的ViewModel但是另一个实例)。

所以,我的问题是:当View2不由View1控制/创建时,如何将Object从一个View1传递到View2(View1只导航到View2)。

我希望很清楚。我将继续监控以根据您的评论进行编辑。感谢

编辑: 基本上,我想要一个视图来获取我可以绑定到下一个视图的数据。我想根据我从http请求获得的对象类型导航到下一个视图。这样,如果有任何错误,我将保持当前视图(而不是移动到下一个视图)。

2 个答案:

答案 0 :(得分:2)

我肯定会查看Laurent Bugnion的MVVM Light toolkit。我已经使用他的框架完成了你所描述的内容,它就像一个冠军!他有一些walkthroughs on his blog以及video on Channel 9来帮助你入门。我还有一个blog series on WP7,其中包含MVVM Light工具包和一个我几乎准备发布的新帖子,正是你所要求的。

基本上,您需要关注的是MVVM Light提供的消息传递基础结构。使用此框架,您的“源”ViewModel将在总线上放置“目标”ViewModel侦听的消息。查看链接,如果适合您,请告诉我们!

/ CK

答案 1 :(得分:0)

如果您可以通过字符串值以某种方式引用共享对象,则可以将此字符串值作为参数传递到View2页面的URL中,并使用NavigationContext.QueryString检索它。

所以当从View1导航时:

string objectId = GetObjectId(sharedObject);
Uri uri = new Uri(
    string.Format("/View2.xaml?objectId={0}", objectId), UriKind.Relative);
NavigationService.Navigate(uri);

在View2的OnNavigatedTo()方法中:

object sharedObject = null;
if (NavigationContext.QueryString.Contains("objectId"))
{
    sharedObject = GetObjectFromId(NavigationContext.QueryString["objectId"]);
}
if (sharedObject != null)
{
    // do some stuff with sharedObject
}

现在您要做的就是实现GetObjectId()和GetObjectFromId()方法。 :)