MVVM 浅谈视图模型是如何实例化的

问题描述 投票:0回答:1

我有一个 wpf 应用程序,并使用 mvvm light 工具包进行数据绑定。我有一个父视图有一个父级的数据网格,子控件有一个子网格,用于访问相同视图模型的选定父级的子级。父级和子级在视图模型中同步良好,因此我不包含代码。问题是这样的:当子控件绑定时如下:

  <UserControl.Resources>
    <CollectionViewSource x:Key="jobRequirementViewSource"
                          d:DesignSource="{d:DesignInstance {x:Type Models:JobRequirement}, CreateList=True}"/>
    <DataTemplate DataType="{x:Type viewModel:jobViewModel}">
        <views:jrView/>
    </DataTemplate>

一切都按预期工作,子网格通过视图模型中的代码与父视图同步。当子网格中的绑定如下时:

<UserControl.DataContext>
    <Binding Path="jobViewModel" Source="{StaticResource Locator}"/>
</UserControl.DataContext>   

然后显然创建了一个新的视图模型实例,并且子网格未与父网格视图模型的实例同步。我正在使用视图模型定位器,并在定位器中创建实例。视图模型在定位器构造函数中使用以下行启动: SimpleIoc.Default.Register(); 并包括视图模型构造函数,如 mvvm light 中的示例 公共 jobViewModel jobViewModel { 得到 {return ServiceLocator.Current.GetInstance(); } } 为什么使用 UserControl.DataContext 绑定设置子控件的数据上下文时会创建视图模型的第二个实例?

wpf xaml mvvm-light
1个回答
1
投票

为什么在使用 UserControl.DataContext 绑定设置子控件的数据上下文时创建视图模型的第二个实例?

因为

ViewModelLocator
在第一次调用
ServiceLocator.Current.GetInstance<jobViewModel>()
期间创建了视图模型的新实例。

MvvmLight 中的

ViewModelLocator
解析的每个对象默认都是单例,因此您应该确保在整个应用程序中使用
ViewModelLocator
创建 jobViewModel 类的
all
实例,即执行以下操作:

var x = new ViewModel.ViewModelLocator();
var vm = x.jobViewModel;

...而不是这个:

var vm = new jobViewModel();

...当您在父视图模型中或在任何实例化它的地方实例化

jobViewModel
时。

© www.soinside.com 2019 - 2024. All rights reserved.