私は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番目のインスタンスが作成されるのはなぜですか?
は、応答をありがとうございました。私はしばらくかかりましたが、上記のように私のコードでエラーが見つかりました。 Parentビューは、(あなたが示したように)viewmodelロケータをバイパスしたコードによって作成されたビューモデルにバインドされていました。したがって、子ビューのxamlをロケータにバインドすると、(ロケータによって作成された)viewmodelの別のインスタンスを使用していましたが、datacontextを介して子ビューをバインドすると、親によって使用されたビューモデルのインスタンスにバインドされますビュー。 –
あなたの問題が解決されたと思います。その答えを受け入れることを忘れないでください:http://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on-stack-overflow – mm8