我有一个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绑定设置子控件的数据上下文时创建了视图模型的第二个实例?
答案 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