XAML MVVM轻视图模型如何示例化

xesrikrc  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(98)

我有一个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>

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

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


然后,很明显,视图模型的一个新示例被创建了,子网格没有与父网格的视图模型的示例同步。我使用的是视图模型定位器,示例是在定位器中创建的。视图模型是在定位器构造器中用下面的行初始化的:SimpleIoc.Default.Register();并根据mvvm light public jobViewModel jobViewModel { get {return ServiceList.Current.GetInstance();} }为什么在使用UserControl.DataContext绑定设置子控件的数据上下文时创建视图模型的第二个示例?

jmp7cifd

jmp7cifd1#

为什么在使用UserControl.DataContext绑定设置子控件的数据上下文时创建视图模型的第二个示例?
因为ViewModelLocator在第一次调用ServiceLocator.Current.GetInstance<jobViewModel>()时创建了视图模型的一个新示例。
MvvmLight中ViewModelLocator解析的每个对象默认都是单例的,所以你应该确保在整个应用程序中使用ViewModelLocator来创建jobViewModel类的 * 所有 * 示例,也就是说,这样做:

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

字符串
......而不是这个:

var vm = new jobViewModel();


.当您在父视图模型中示例化jobViewModel时,或者在您示例化它的任何地方。

相关问题