2011-11-14 1 views
6

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)を一緒に使用する方法はありますか?

+0

なぜ宣言を行わないようにするには、ビューのXAML内でViewModelのDataContextを宣言的に指定しますか? –

+0

目的は、実行時にデザインタイムのダミーViewModels(A)とDataTemplateの解像度(C)の両方をサポートするテクニックを見つけることです。 –

答えて

8

あなたがそうのように、DataContextのが唯一の唯一の設計時の場合に設定されていることを指定することができます。詳細については

<UserControl ... 
    d:DataContext="{d:DesignInstance my:BrowseAssetsViewModel}" 
> 

、MSDNのUsing a DesignInstance...を参照してください。

+3

また、 'IsDesignTimeCreatable = True'を追加すると、VSに表示されます。 例:d:DataContext = "{d:DesignInstanceType = local:BrowseAssetsViewModel、IsDesignTimeCreatable = True}" –

+0

この回答は、コメントに記載されているIsDesignTimeCreatable = Trueと組み合わせて問題を解決しました。ありがとう、両方のあなた。 -Larry –

関連する問題