Declarative DataContextとData Templateの両方を使用してViewとViewModelを結ぶことはできますか?ランタイムの設計時およびデータテンプレートに宣言型DataContextを使用してMVVM ViewおよびViewModelを配線しますか?
ゴール:設計時にビューを1つ、実行時にビューを1つのViewModelで配線したいとします。現在、デザイン時VMおよびデータテンプレート指定VMの宣言型データコンテキストを実行時に使用すると、期待どおりに動作しません。
背景 - 以下を含むビューとビューモデルまで配線するためのさまざまな方法があります。
A.)はが宣言ビューのXAML内のViewModelのDataContextを指定します。この技法は、ダミーデータを渡すために、パラメータなしのコンストラクタを使用するDesign-Timeで役に立ちます。
<UserControl.DataContext>
<my: BrowseAssetsViewModel />
</UserControl.DataContext>
B.)はプログラムのViewModel、ビューとのDataContextを指定します。
// …Setup code
BrowseAssetsViewModel viewModel = new BrowseAssetsViewModel(assetRegistry, domains);
BrowseAssetsView view = new BrowseAssetsView();
view.DataContext = viewModel;
アプローチBは、アプローチAと組み合わせて使用される場合、実行時にWPFがアプローチB.
で指定されたパラメータ化コンストラクタとビューモデルのバージョンを使用して、アプローチAにおいて指定されたデフォルトのDataContextをオーバーライドC.)View-ViewModelアソシエーションのデータテンプレートを定義する App.XAML Application.ResourcesでViewとViewModelを関連付けることにより、WPFはViewModelのタイプに基づいて正しいViewをワイヤリングできます。
<DataTemplate DataType="{x:Type vm: BrowseAssetsViewModel }">
<vw: BrowseAssetsView />
</DataTemplate>
のViewModelプロパティはのContentPresenterコントロールにバインドされた場合、WPFは(のViewModelのタイプに基づいて)、対応するビューをアップ配線とのContentPresenter内に配置します。これは、ViewModelが表示され、提示されたViewModelのタイプを調べることによってWPFが正しいViewを解決して配線する「ViewModel-first」シナリオで役立ちます。
問題 - アプローチAとの組み合わせで、このアプローチCを使用する場合は、パラメータなしのコンストラクタ(アプローチA)を介して宣言的に指定のViewModelを呼び出して、WPFが正しいビューを解決するが、その後、ビューを再クエリするようです既存のViewModelプロパティをオーバーライドします。
質問 - CのViewModelプロパティを誤って上書きしないでこれらのテクニック(CとA)を一緒に使用する方法はありますか?
なぜ宣言を行わないようにするには、ビューのXAML内でViewModelのDataContextを宣言的に指定しますか? –
目的は、実行時にデザインタイムのダミーViewModels(A)とDataTemplateの解像度(C)の両方をサポートするテクニックを見つけることです。 –