2017-02-19 76 views
-1

我有一个wpf应用程序,并正在为我的数据绑定使用mvvm light toolkit。我有一个父视图有一个父母的数据网格,并且子控件具有一个子网格,用于访问相同视图模型的所选父级的子级网格。父视图和子视图在视图模型中很好地同步,所以我不包含代码。问题是这样的:当孩子控件绑定如下: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中的示例光 public jobViewModel jobViewModel {get {return ServiceLocator.Current.GetInstance(); } } 为什么在使用UserControl.DataContext绑定设置子控件的数据上下文时创建视图模型的第二个实例?

回答

1

为什么在使用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无论你在哪里实例化它。

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

+0

谢谢你的答复。这花了我一段时间,但我发现我的代码中的错误,如上所述。父视图绑定到由绕过视图模型定位器的代码创建的视图模型(如您所示)。因此,当我将子视图的xaml绑定到定位器时,它使用了viewmodel的不同实例(由定位器创建),但是通过datacontext绑定子视图将其绑定到父视图使用的视图模型的实例视图。 –

+0

我想你的问题已经解决了。请记住接受答案:http://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow – mm8