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

Wpf 如何在MVVM Light中拥有同一ViewModel的多个实例?,wpf,mvvm-light,Wpf,Mvvm Light,我将MVVM Light用于带有选项卡的WPF应用程序(有点像Internet Explorer)。每个选项卡必须是一对独特的视图和视图模型。我知道我的选项卡控件中有多少个实例 由于MVVM Light的设计,我不能同时拥有ViewModel的多个实例(定位器中的静态属性)。在codeplex网站上,我找到了以下解决方案: 我处理这个问题的方法是使ViewModelLocator中的ViewModel属性(例如MainViewModel的Main属性)在每次调用时返回不同的MainViewMod

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

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

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

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

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


我希望我的问题足够清楚,如果你需要更多细节,请告诉我

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

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

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

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


HTH

我曾经在我的博客上解释过如何使用这种场景

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

因此,我建议连接到tab changed事件并在该点检索您的密钥。 不确定如何在视图中跟踪关键点,但我猜您已经有了它,如果没有,您可以始终将其存储在控件的某个标记属性中

最后但并非最不重要的一点是将datacontext与所需的viewmodel绑定,您可以这样做:

tabControl.DataContext = ViewModelLocator.GetViewModel<***ViewModel>(tabKey);
tabControl.DataContext=ViewModelLocator.GetViewModel(tabKey);
TabControl是当前活动的选项卡(我猜应该在该选项卡上设置datacontext?) TabKey是检索正确的相应viewmodel所需的当前选定选项卡的唯一键

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

谢谢你的回答:)。我已经将DataTemplate与DataTemplateSelector和视图模型的ObservableCollection一起使用。如果我正确理解了您的解决方案,它将不适用于我,因为我不知道(运行前)必须显示多少选项卡,而且我还可以让多个选项卡显示同一视图(每个视图都有自己的viewmodel实例)。因此,我不能使用你的解决方案。