2012-03-03 3 views
1

私のアプリケーションでmvvmから使用しています。私はmvvmパターンで私のユーザコントロールを定義する方法を知りたい。mvvmパターンでusercontrolsを定義する方法は?

mvvmからの使用で定義する必要がありますか、それとも一般的に定義できますか?

答えて

2

私はユーザーコントロールに依存すると思います。ユーザーコントロールはビューに過ぎません。その場合は、このユーザーコントロールを全体の一部として持つ大きなコントロールまたはページを作成します。大きなコントロールまたはページは、このビューのビューおよびビューモデルパーツを提供します。

または、それが含まれているより大きなユーザーコントロールとやりとりするために、すべてのmvvmとuseイベントを持つ自己完結型のユーザーコントロールを作成できます。

私は、第2のアプローチでより良い再利用とモジュール化ができると思っています。

要するに:それは依存する。

+0

:あなたはそれを行う場合は、あなただけのUserVmを(XAMLでそれをインスタンス化し、または結合のいずれかを介して)配置する必要がありますコントロール?どのように私のプロパティをコントロールビューモデルにxamlコードでバインドできますか? –

+0

コントロールのxamlはそのビューモデルにバインドされます。外側のモデル(より大きなコントロールのモデル)の仕事は、内側のビューモデルを作成し、それを内側のビュー/コントロールのインスタンスに渡すことです。 – Rohith

+0

このサンプルコードを教えてもらえますか? –

3

ユーザーコントロールMainWindowとユーザーコントロールUserControlを組み込むコントロールを呼び出してみましょう。あなたはMVVMパターンであるため、外部ビューのための少なくとも1つのビューモデルがあります。通常、MainVmという名前を使用します。 ユーザコントロールには2つの選択肢があります。UserControl(UserVm)の場合と同じビューモデルを共有することも、サブビューモデルを持つこともできます。

最初に選択したものは何もしません。あなたはUserControlを定義します(Visual Studioの新しい項目の追加 - > User Controlはかなり良いスタートです)。次に、それを単にメインウィンドウに埋め込みます。

<Window 
    x:Class="SO.MainWindow" 
    ... 
    xmlns:src="clr-namespace:SO" 
    ... 
    > 
    ... 
    <src:UserControl /> 
    ... 
</Window> 

ユーザーコントロールはメインウィンドウから同じのDataContextを継承し、すべてのあなたがメインウィンドウで行うように{}バインディングありません。

サブビューモデル(UserVm)が必要な場合は、通常はMainVmのパブリックプロパティ(userVmなど)です。その場合は、UserControlのDataContextを参照するときにそれを設定します。

<src:UserControl DataContext="{Binding Path=userVm}" /> 

もう一つの人気のパラダイムは、ユーザーコントロールの代わりにするDataTemplateを宣言するだろう。私はMVVMから使用している場合ではどのように私は私から使用することができます...私のコントロールの定義

<Window x:Class="MainWindow" ...> 
    <Window.Resources> 
     <DataTemplate x:Key="UserDt"> <!-- or user TargetType instead of x:Key --> 
      ... 
     </DataTemplate> 
    </Window.Resources> 

    ... 

    <!-- You can put in a ContentControl like here: --> 
    <ContentControl Content="{Binding Path=userVm}" 
        ContentTemplate="{StaticResource UserDt}" /> 

    <!-- or, if you defined TargetType for the DT, you can simply instantiate 
     the sub VM here. I don't like this apporach but it exists. --> 
    <src:UserVm /> 
</Window> 
関連する問題