0

我将 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 中做到这一点?

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

4

2 回答 2

1

我曾经在我的博客上解释了如何使用这种场景http://depblog.weblogs.us/2014/02/11/navigating-to-same-viewmodel-but-with-different-data-and-keep-导航堆栈正确与 mvvm-light/

它适用于 Windows Phone,但也适用于 WPF。您的设置与我的设置的唯一区别是您需要从每个选项卡中获取您的唯一 ID,因为我在导航到新视图时得到了我的 ID。

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

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

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

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

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

于 2016-02-09T10:17:50.820 回答
0

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

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

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

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

高温高压

于 2012-06-08T18:41:12.223 回答