2017-02-19 9 views
-1

私はwpfアプリケーションを持っていて、mvvmライトツールキットを使用してデータバインディングを行っています。私は親ビューに親のデータグリッドがあり、子コントロールには同じビューモデルにアクセスする選択された親の子の子グリッドがあります。親と子はビューモデルでうまく同期しているので、コードは含めません。問題はこれです:次のように子コントロールがバインドされている場合:MVVMライトビューモデルのインスタンス化

<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バインディングを使用して設定されている場合、ビューモデルの2番目のインスタンスが作成されるのはなぜですか?

答えて

1

子コントロールのデータコンテキストがUserControl.DataContextバインディングを使用して設定されていると、ビューモデルの2番目のインスタンスが作成されるのはなぜですか?

ViewModelLocatorは、ServiceLocator.Current.GetInstance<jobViewModel>()への最初の呼び出し時にビューモデルの新しいインスタンスを作成するためです。あなたがあなたのアプリケーション全体でjobViewModelクラスのすべてのインスタンスを作成するためにViewModelLocatorを使用することを確認する必要がありますので、

MvvmLightでViewModelLocatorによって解決すべてのオブジェクト

は、デフォルトではシングルトンです、つまり、次の操作を行います。

var x = new ViewModel.ViewModelLocator(); 
var vm = x.jobViewModel; 
あなたが親ビューモデル0で jobViewModelをインスタンス化

var vm = new jobViewModel(); 

...:これに代えて

...あなたがそれをインスタンス化するどこにでも。

あなたがあなたの問題のレポを提供しなければならない任意の更なるヘルプが必要な場合:https://stackoverflow.com/help/mcve

+0

は、応答をありがとうございました。私はしばらくかかりましたが、上記のように私のコードでエラーが見つかりました。 Parentビューは、(あなたが示したように)viewmodelロケータをバイパスしたコードによって作成されたビューモデルにバインドされていました。したがって、子ビューのxamlをロケータにバインドすると、(ロケータによって作成された)viewmodelの別のインスタンスを使用していましたが、datacontextを介して子ビューをバインドすると、親によって使用されたビューモデルのインスタンスにバインドされますビュー。 –

+0

あなたの問題が解決されたと思います。その答えを受け入れることを忘れないでください:http://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow – mm8

関連する問題