如何使用viewmodel将数据(例如,selecteditem)从一个视图传递到另一个视图

时间:2010-10-31 12:28:23

标签: mvvm-light

一些基本问题,但我看到的大多数示例,只包含一个带有一个viewmodel和一个viewmodellocator的视图,所以我的问题是:

  • 每个viewmodel都有自己的viewmodellocator吗? (用于viewmodellocator的mvvm light工具包中包含的片段似乎暗示了这一点,因为它生成了一些方法,例如。对于您创建的每个viewmodellocator具有相同名称的清理)
  • 视图DataContext绑定到ViewModeLocator,但是如何指定它有一个参数(例如,您希望此ViewModel检索某个客户记录)

2 个答案:

答案 0 :(得分:1)

您应该只有一个ViewModel定位器,可以为匹配的视图提供正确的ViewModel。

通常,ViewModelLocator与某种IoC Framwork一起工作,为正确的情况注入正确的ViewModel。 示例:您有一个DisgnTimeViewModel和一个RuntimeViewModel,Locator负责确定要传递哪一个。 另一点是......您可以在UserControl的DataContext属性上轻松地在Xaml中定义ViewModel。这仅适用于ViewModel ctor无参数的情况。当您想要注入服务时,您也可以通过IOC执行此操作,并让ViewModelLocator找出布线和实例...

为了传递对象和参数,我建议在MVVM Toolkit Light中查看EventAggregator或Messenger的概念。消息将被发送出去,并且订阅的每个ViewModel都可以接收消息。 也可以在诸如ID或对象之类的消息中具有有效载荷......

希望这会有所帮助......

答案 1 :(得分:0)

您的ViewModelLocator(Locator)应该拥有您拥有的每个ViewModel的属性。

示例:您有一个ExampleViewModel ViewModel类

  • Locator课程中:ExampleViewModel应为属性
  • 在View1 xaml中:DataContext="{Binding ExampleViewModel, Source={StaticResource Locator}}"
  • 在View2 xaml中:DataContext="{Binding ExampleViewModel, Source={StaticResource Locator}}"

您应该能够绑定到您在Locator中指定的任何ViewModel以及您想要的多个视图(不是100%确定第二部分)。