如何在MVVM Light中拥有相同ViewModel的多个实例?

时间:2012-06-06 13:09:14

标签: wpf mvvm-light

我正在使用MVVM Light作为带有标签的WPF应用程序(有点像Internet Explorer)。每个选项卡必须是几个独特的View和View模型。我知道我会在tab控件中有多少个实例。

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

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

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

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

我希望我的问题很清楚,如果您需要更多细节,请告诉我。

2 个答案:

答案 0 :(得分:0)

我通常要做的是为包含制表符控件的窗口制作视图模型内的视图模型列表。执行此操作的XMAL如下所示:

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

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

如果每个标签都有唯一的数据,那么我仍然会为窗口使用1个视图模型,使每个标签项的内容成为自定义控件,并从主视图模型中设置其datacontext。

HTH

答案 1 :(得分:0)

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

它适用于Windows手机,但也适用于WPF。 只有您的设置与我的设置不同的是,您需要从每个选项卡中获取您的唯一ID,因为我在导航到新视图时会得到我的。

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

最后但并非最不重要的是将datacontext与所需的viewmodel绑定,这就是你如何做到的:

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

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

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