MVVM指示如何实例化视图模型

时间:2017-02-19 13:07:02

标签: wpf xaml mvvm-light

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

  <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>   

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

1 个答案:

答案 0 :(得分:1)

  

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

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

默认情况下,MvvmLight中ViewModelLocator解析的每个对象都是单例,因此您应该确保使用ViewModelLocator创建<{1> {{1>的所有实例整个应用程序中的类,即执行此操作:

jobViewModel

......而不是:

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

...在父视图模型中实例化var vm = new jobViewModel(); 或在实例化它的任何地方。

如果您需要任何进一步的帮助,请提供问题的回购:https://stackoverflow.com/help/mcve