2017-02-19 52 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