2011-07-14 7 views
7

私はかなり基本的なWPF UIを持っているので、ユーザーの要求によってTabControlで新しいタブが開きます。ViewModelの管理に関する質問(DesignTimeと実行時間)

<DataTemplate DataType="{x:Type viewModels:UserUploadsViewModel}"> 
     <userControls:UserUploads /> 
    </DataTemplate> 

今度は、私は「UserUploadsコントロールの内部を言わせて:TabControlのは、私はこのコレクションにViewModelにインスタンスを追加し、対応するタブの内容は、このようなテンプレートに基づいて表示されるObservableCollection<ViewModelBase>

にバインドされていますこのように、設計を支援するためにXAMLでVMを配線したいとdは:

<UserControl x:Class=".....UserUploads" 
    ..... 
    DataContext="{Binding Source={StaticResource ViewModelLocater}, 
        Path=UserAdministrationViewModel}"> 

このプロパティは設計時にモックデータでVMを実行時にライブサービスでVMを返す、となります。

質問:このXAMLは、TabItemsコンテンツをViewModelインスタンスにバインドする際に私がやっていることに干渉し、正しいViewをレンダリングするために上記のdataTemplateに依存していますか?もしそうなら、これらのコンセプトの両方を一緒に働かせる方法はありますか?

答えて

22

これは簡単な方法です。 DesignTimeUserAdministrationViewModelを持っており、コンストラクタで静的データを移入としてUserControlにそれを参照してください:あなたはd:DataContextにバインドされた設計時のテストデータと実際のDataContextにバインドされたランタイムライブデータを持っている。この方法を

<UserControl d:DataContext="{d:DesignInstance designTimeVMs:DesignTimeUserAdministrationViewModel, IsDesignTimeCreatable=True}"> 

。詳細はhereです。 MSのものに建て

+0

これはすばらしく見えます。だから、デザインタイムであれば、その(デザインタイムビューモデル)オブジェクトは配線されますが、実行時には何もしません。 –

+1

はい、それは混和性のために追加されました。 – anivas

+0

素晴らしい! 'IsDesignTimeCreatable = True'を使うとビューにデータが移ります。 'False'に設定すると、データの「形」だけが提供され、盲目的にバインドするのではなく、デザイナーで完全なデータバインディングをサポートします。また、.x​​amlファイルを使用して、 '{d:DesignData}'でサンプルデータを完全に指定することもできます。 (http://msdn.microsoft.com/en-us/library/dd490796(VS.100).aspxの)と[チュートリアル:[デザイナーでデータにバインドするDesignInstanceを使用したチュートリアル]:参照でサンプルデータを使用してWPF Designer](http://msdn.microsoft.com/en-us/library/ee823176(v = vs.100).aspx) – cod3monk3y

1

はい、私はそれはあなたの現在の設定を妨害する

思いViewModelLocatorは、設計時間、および実行時に静的ViewModelににダミーのオブジェクトを返す静的なクラスです。これは/あなたがオープンを管理することはできません

  • 同じタブの複数のインスタンス(ViewModelに)一度にオープンにすることはできません

    • ViewModelLocatorではなく、あなたのParentViewModelは、あなたのTabViewModelsが含まれていることを意味しViewModelがビューを認識しないMVVMの原則に違反しているUserControlを参照しない限り、閉じたタブ

    • 新しいコピーをインスタンス化することはできませんパラメータ化されたコンストラクタを持つTabViewModelのたとえば、OpenTabs.Add(new CustomerViewModel(CustomerId));

    おそらく代替手段はコンバータですか?設計時には静的オブジェクトを返し、実行時にはバインドされたオブジェクトを返します。私はそのようなことをテストしたことはありませんが、理論的にはうまくいくはずです:

  • 1

    は悪くないですが、私は私のプロジェクトで忙しい組み込んだよ別の、よりエレガントかつ構造的に音の選択肢は次のとおりです。 http://msdn.microsoft.com/en-us/magazine/dn169081.aspx

    基本的に、あなたはそれがSimpleIocコンテナとMVVMライトツールキットを使用します次の3つのシナリオでデータを提供する能力を備えています。

    設計時間、実行時間、およびテスト時間。

    より良いまだ、MVVM光の全体のポイントは、自分のものはBlendで直接編集可能にすることですし、それをすべてを説明ビデオ、ブログやサンプルアプリケーションの全シリーズがあります。以前の私のWPFの調査でこれを見つけてください。

    関連する問題