【问题标题】:How to have multiple instances of the same ViewModel in MVVM Light?如何在 MVVM Light 中拥有同一个 ViewModel 的多个实例?
【发布时间】:2012-06-10 12:09:54
【问题描述】:

我将 MVVM Light 用于带有选项卡的 WPF 应用程序(有点像 Internet Explorer)。每个选项卡都必须是几个独特的 View 和 View 模型。我知道我的选项卡控件中有多少个实例。

由于 MVVM Light 的设计,我不能同时拥有多个 ViewModel 实例(定位器中的静态属性)。在 codeplex 网站上,我找到了以下解决方案:

我处理此问题的方法是让 ViewModelLocator 中的 ViewModel 属性(例如 MainViewModel 的 Main 属性)在每次调用时返回 MainViewModel 的不同实例。这样每个视图都会有一个单独的 MainViewModel 实例。

但是,这意味着解析给定窗口的 DataContext 有点复杂(因为 ViewModel 不再保持静态)。如果需要解析,可以在 ViewModelLocator 中根据 View 中存储的唯一 ID 构建查找表,或者使用 IOC 容器根据 key 实例化和解析 ViewModel 实例。

我知道我必须在每个视图中注入一个 ID,我知道我必须在定位器中维护这些 ID 的列表,我知道我必须在定位器中查找以将每个视图与正确的定位器相关联,但是我不知道如何将此 ID 从我的视图传递到定位器。如何在我的视图的 XAML 中做到这一点?

我希望我的问题足够清楚,如果您需要更多详细信息,请告诉我。

【问题讨论】:

    标签: wpf mvvm-light


    【解决方案1】:

    我曾经在我的博客http://depblog.weblogs.us/2014/02/11/navigating-to-same-viewmodel-but-with-different-data-and-keep-navigation-stack-correct-with-mvvm-light/ 上解释过如何使用这种场景。

    它适用于 windows phone,但也适用于 WPF。 您的设置与我的设置的唯一区别是您需要从每个选项卡中获取您的唯一 ID,就像我在导航到新视图时获取的一样。

    所以我的建议是连接到选项卡更改事件并在那时检索您的密钥。 不知道你如何在视图中跟踪你的键,但我猜你有它可用,如果没有,你总是可以将它存储在控件的某个 Tag 属性中。

    最后但并非最不重要的是将数据上下文与所需的视图模型绑定,这就是您可以这样做的方法:

    tabControl.DataContext = ViewModelLocator.GetViewModel<***ViewModel>(tabKey);
    

    TabControl 是当前活动选项卡(我猜应该在上面设置 datacontext?) TabKey 是当前选定选项卡的唯一键,需要检索正确的相应视图模型

    对不起,高级伪代码,但因为您没有添加当前解决方案的一些参考代码,所以有点猜测工作;)

    【讨论】:

      【解决方案2】:

      我通常会在包含选项卡控件的窗口的视图模型中创建一个视图模型列表。执行此操作的 XMAL 如下所示:

      <TabControl ItemsSource="View model list here">
                  <TabControl.ItemTemplate>
                      <DataTemplate>
                            <!-- Your user control here -->
                      </DataTemplate>
                  </TabControl.ItemTemplate>
              </TabControl>
      

      解决视图模型定位器问题,因为您的主视图模型将包含每个选项卡的视图模型并且知道如何解决它。

      如果每个选项卡都有唯一的数据,那么我仍然会为窗口使用 1 个视图模型,使每个选项卡项的内容成为自定义控件并从主视图模型设置它们的数据上下文。

      HTH

      【讨论】:

      • 感谢您的回答:)。我已经将 DataTemplate 与 DataTemplateSelector 和我的视图模型的 ObservableCollection 一起使用。如果我正确理解了您的解决方案,它将对我不起作用,因为我不知道(在运行时之前)我必须显示多少个选项卡,而且我还可以有多个选项卡显示相同的视图(每个视图都有它自己的实例视图模型)。因此,我无法使用您的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      相关资源
      最近更新 更多