我有一个 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 绑定设置子控件的数据上下文时会创建视图模型的第二个实例?
为什么在使用 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
时。