【问题标题】:How to pass data (eg. selecteditem) from one view to another view using viewmodel如何使用 viewmodel 将数据(例如 selecteditem)从一个视图传递到另一个视图
【发布时间】:2010-10-31 12:28:22
【问题描述】:

一些基本问题,但我看到的大多数示例只包含一个视图,一个视图模型和一个视图模型定位器,所以我的问题是:

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

【问题讨论】:

    标签: mvvm-light


    【解决方案1】:

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

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

    对于传递对象和参数,我建议查看 MVVM Toolkit Light 中的 EventAggregator 或 Messenger 的概念。消息发送得很糟糕,每个订阅的 ViewModel 都可以收到这些消息。 也可以在这样的消息中包含有效负载,例如 ID 或对象...

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

    【讨论】:

      【解决方案2】:

      您的 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% 确定第二部分)。

      【讨论】:

      • 我不明白所有的视图模型都是静态的。当我想打开一个编辑窗口时,它总是会显示相同的数据。我希望能够为编辑窗口创建一个新的视图模型实例(假设您可以有 2 个相同类型的编辑窗口,同时打开......静态视图模型是不可能的)。创建一个新实例还可以确保所有属性都设置为其默认值(例如,一些用于启用/禁用按钮的属性等)
      • 您可以尝试以下操作:在 MainWindow 中,用户单击指向 RelayCommand EditCommand 的 Edit;然后在 MainWindow 的 ViewModel 你有一个 ObservableCollection Editors {get; private set;},并在 EditCommand{ Editors.Add(new EditViewModel(){/*set Defaults*/}); }
      猜你喜欢
      • 1970-01-01
      • 2021-11-09
      • 2018-01-25
      • 1970-01-01
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      相关资源
      最近更新 更多