Windows phone 8 MVVM-与其他VM共享封装模型

Windows phone 8 MVVM-与其他VM共享封装模型,windows-phone-8,mvvm,parent-child,messaging,Windows Phone 8,Mvvm,Parent Child,Messaging,在我的Windows Phone应用程序中,有一个简单的层次模型,由一个包含其他域对象集合的类组成 在我的xaml中,我声明了一个ItemsContainer控件,它将上述集合中的项呈现为简单的矩形 现在,在VM级别,我有一个类似于我的模型的结构,父VM有一个子VM集合。每个子VM封装自己的模型 每当用户点击绑定到子VM的视图时,应调用父模型对象的方法,并将相关子模型作为参数。这将反过来改变一些内部状态,这些状态将(可能)反映在所有子视图(而不仅仅是被点击的视图)上 所以。。。鉴于我使用的是MV

在我的Windows Phone应用程序中,有一个简单的层次模型,由一个包含其他域对象集合的类组成

在我的xaml中,我声明了一个ItemsContainer控件,它将上述集合中的项呈现为简单的矩形

现在,在VM级别,我有一个类似于我的模型的结构,父VM有一个子VM集合。每个子VM封装自己的模型

每当用户点击绑定到子VM的视图时,应调用父模型对象的方法,并将相关子模型作为参数。这将反过来改变一些内部状态,这些状态将(可能)反映在所有子视图(而不仅仅是被点击的视图)上

所以。。。鉴于我使用的是MVVM Light框架,我当前的实现如下所示:

  • 子VM公开一个命令
  • 命令执行方法将使用messenger将tap事件通知父VM。消息(GenericMessage类)内容将是VM封装的域对象
  • 父VM使用消息内容作为参数执行父模型的方法
  • 如果操作成功,父VM将发送一条新消息,通知子VM这一事实。同样,消息内容是刚刚调用的方法中用作参数的模型对象
  • 子VM引发两个PropertyChanged事件,最终将更新绑定视图
它能用,但我觉得有点麻烦。最让我头疼的是,当点击子视图时,关联的VM将广播其封装的模型对象。你是否觉得有更好的方法来实施这样一个系统


提前感谢您宝贵的帮助

您能否将命令放在父视图模型上,并将子视图模型作为命令参数传递


然后,父视图模型可以调用子视图模型上的方法来更新它们。我不确定是否需要所有这些消息?

我看到了两个问题:1)如何从xaml绑定到父命令而无需破解(在ItemsContainer的ItemTemplate中)-2)父VM的命令必须访问由子VM封装的模型才能完成任务,我认为这不应该发生1)您可以使用RelativeSource或ElementName等。我一直都在引用,比如从项目内部引用项目控件。如果您真的不喜欢这个,那么只需将命令传递给构造函数中的子VM,它就可以直接公开它。2) 子VM不能公开一个执行任何需要的操作的方法吗?在不确切知道您正在做什么的情况下很难进行评论。我将提供更多信息:父对象是映射,子对象是位置-点击位置时,命令将更改映射的CurrentLocation属性,但仅当方法Map.CanMoveTo(location)返回true时。这就是为什么我需要从我的虚拟机的LocationViewModelLoads中获取封装位置的原因。这些模型是用来表示数据的,所以让人们使用它们。只有在其他代码不了解它们的情况下,才需要对它们进行封装。地图清楚地知道并使用位置。如果你想的话,你可以直接公开身份证,但这对我来说似乎没什么意义。如果某个对象可以访问一个ID,那么如果它需要,它肯定可以去获取相应的模型对象?为什么不给它一个对象呢?你可以在它的构造函数中将parent命令传递给childVM,如果你愿意,childVM只会公开它。甚至只是传入一个在调用其命令时子级调用的操作。但前者可能更简单。