ホーム > コンピュータ > C# > WPF in C# > Prism

ベクトルドロー・レベルゼロ+

Prism Library 5.0 for WPFを使用してMVVMパターンを実装する 03[C# WPF Prism]

概要

MVVMパターン調べていて、Prismというツールキットを見つけました。MVVMパターンを使用するためのもっとも人気のあるツールキットのようです。

原文

訳文

Implementing the MVVM Pattern Using the Prism Library 5.0 for WPF(外部サイト)

パターンと実践 ディベロパー・センター

Microsoft Prism Library 5.0 for WPFの開発者のガイドから:

構築と接続

Construction and Wire-Up

MVVMパターンは、あなたが、あなたのUIをあなたのプレゼンテーションとビジネス・ロジックとデータから、きれいに分離するに役立ちます。 それで、正しいクラスで正しいコードを実装することは、効果的にMVVMパターンを使用する際の重要な最初の手順です。 また、データ結合とコマンドを通して、ViewとView Modelクラスの間の相互作用を管理することは、考えるための重要な測面です。 次の手順は、View、View ModelとModelクラスが、実行時に、互いに、どのようにインスタンスを生成し、関連づけるか、考えます。

備考

この手順を管理するために、適切な戦略を選択ことは、特に重要です。 あなたが、あなたのアプリケーションの依存関係注入コンテナを使用している場合、 拡張管理フレームワーク(MEF)とUnityアプリケーション・ブロック(Unity)の両方は、 View、View ModelとModelクラスと間で、それらを持つために、コンテナで、実現する、指定する依存関係の機能を提供します。 より高度な筋書きのために、高度なMVVMの筋書き(原文リンク)を参照してください。

一般的に、ViewとそのView Modelの間に、1対1のリレーションシップがあります。ViewとView Modelは、ビューのデータ・コンテクスト・プロパティを通して、 疎く結合しています。;これは、ビュー内で、View Modelのプロパティ、コマンドとメソッドに結合されるデータの中で、視覚的な要素と動作を提供します。 あなたは、実行時に、DataContextプロパティを通して、ViewとView Modelクラスとそれらの関連付けのインスタンス化を、どのように管理するか、決定する必要があるでしょう。

また、注意する必要があります。疎結合が保持されているか確認するために、ViewとView Modelを構築し、結合するとき、先の項目で指摘したように、 View Modelは、理想的には、どんな、ビューの具体的な実装にも依存してはいけません。 同様に、ビューは、理想的には、どんな、View Modelの具体的な実装にも依存してはいけません。

備考

しかしながら、それは、Viewが、View Modelの具体的なプロパティ、コマンドとメソッドに暗黙的に依存すると思われることに、 注意する必要があります。それが、定義するデータ結合のため、View Modelが、必要とされるプロパティ、コマンドやメソッドを実装しない場合、 実行時例外は、デバッグの間、Visual Studio出力ウィンドウで表示される、データ結合エンジンで作成されます。

ViewとView Modelが、実行時に、構築し、関連付けることができる複数の方法が、あります。 あなたのアプリケーションのための最も適切な方法は、主に、あなたが、最初に、ViewやView Modelを作成するかどうか、 そして、あなたが、プログラム上で、あるいは、宣言的に、これを行うかどうか、次第です。次のセクションでは、一般的な方法を説明します。 ViewとView Modelクラスは、実行時に、それに、互いに、作成し、関連付けることができます。

XAMLを使用して、View modelを作成する

Creating the View Model Using XAML

おそらく、最も単純な方法は、ビューに宣言的に、XAMLで、View Modelの、その対応するインスタンスを生成することです。ビューが構築されるとき、 対応するView Modelオブジェクトもまた、構築されます。 また、あなたは、View Modelが、ビューのデータ・コンテクストとして設定されているXAMLで指定することができます。


<UserControl.DataContext>
    <my:MyViewModel/>
</UserControl.DataContext>

このビューが作成されるとき、MyViewModelのインスタンスは、ビューのデータ・コンテクストとして自動的に構築されて、設定されます。 この方法は、既定の(パラメータのない)コンストラクタを持つために、あなたのView Modelを必要とします。

ビューで、View Modelの宣言型の構築と割当てを行うことは、Microsoft Expression Blendや Microsoft Visual Studioのような、設計時のツールで、それを単純に、そして、うまく動作するために、利点があります。 この方法の欠点は、ビューが、対応するView Model型についての知識があるということです。そして、 View Model型は、既定のコンストラクタを持つ必要があります。

プログラム上でView modelを作成する

Creating the View Model Programmatically

他の方法は、ビューのために、プログラム上の、そのコンストラクタ内で、それをその対応するView Modelインスタンスに、インスタンス化することです。 次のコードの例に示すように、それは、続いて、そのデータ・コンテクストとして、それを設定することができます。



public MyView() { InitializeComponent(); this.DataContext = new MyViewModel(); }

View Modelのプログラムに基づいた構築と割当ては、ビューの分離コードの範囲内で、利点があります。 Expression BlendやVisual Studioのように、設計時にツール内で、それが簡単で、うまく動作します。 この方法の欠点は、ビューが対応するView Model型についての知識が必要だということです。 そして、それは、ビューの分離コード内で、コードを必要とします。UnityやMEFのような、 依存関係注入コンテナを使用することは、ViewとView Modelの間で、疎結合を維持することに役立ちます。 詳細については、コンポーネントの間で、依存関係を管理する(原文リンク)を参照してください。

View modelロケーターを使用して、View modelを作成する

Creating the View Model Using a View Model Locator

View Modelロケーターを使用して、View Modelインスタンスを作成する他の方法とそのビューによるそれがある同僚をします。

ViewModelLocationProviderクラス内で、ビューのためのView Modelを解決するために、AutoWireViewModelChangedメソッドの呼び出しを設定するとき、 PrismのView Modelロケーターは、AutoWireViewModel添付プロパティを持っています。デフォルトで、それは、規則に基づく方法を使用します。

基本的なMVVMクイックスタートでは、MainWindow.xamlは、View Modelを解決するView Modelロケーターを使用します。


...
    prism:ViewModelLocator.AutoWireViewModel="True">

添付プロパティを持っている、PrismのViewModelLocatorクラスは、trueに設定する時、 AutoWireViewModelは、ビューのView Modelを配置しようと試すでしょう。 そして、その次に、Viewのデータ・コンテクストを、View Modelのインスタンスに設定します。 対応するView Modelを配置するために、ViewModelLocationProviderは、まず、どんなマッピングからでも、 View Modelを解決ために、試みます。それは、ViewModelLocationProviderクラスのRegisterメソッドによって登録されたかもしれません。 View Modelが、この方法を使用して、解決することができない場合、たとえば、マッピングが作成されない場合、ViewModelLocationProviderは、 正しいView Model型を解決するために、規則に基づいた方法に戻します。この規則は、View Modelが、ビュー型として、同じアセンブリ内にある事を前提とします。 そのView Modelは、.ViewModels child名前空間にあります。そのビューは、.Views child名前空間にあります。 そして、View Model名は、View名と「ViewModel.」の末端に一致します。 PrismのView Model Locator規則を、どのように変更するかの説明のために、 付録E:Prismを拡張する(原文リンク)を参照してください。

備考

Prism.Mvvm NuGetパッケージで配置される、ViewModelLocationProviderはMicrosoft.Practices.Prism.Mvvmアセンブリで見つかり、 そして、ViewModelLocatorはMicrosoft.Practices.Prism.Mvvm.Desktopアセンブリで見つかります。

データ・テンプレートとして定義されるビューを作成する

Creating a View Defined as a Data Template

ビューは、データ・テンプレートとして、定義され、View Model型で関連付けることができます。 データ・テンプレートは、リソースとして、定義することができます。 あるいは、それらは、View Modelを表示する、コントロールの内のインラインで定義することができます。 コントロールの「内容」は、View Modelインスタンスです。 そして、データ・テンプレートは、視覚的にそれを表示するために使用されます。 WPFは、自動的に、データ・テンプレートのインスタンスを生成します。 そして、そのデータ・コンテクストを、実行時のView Modelインスタンスに設定します。 この技術は、状況の例です。 View Modelが、まず、その中で、インスタンス化され、続いて、ビューが作成されます。

データ・テンプレートは、柔軟で、軽量です。UIデザイナーは、どんな複雑なコードも必要とすることなく、 簡単に、View Modelの視覚的な表現を定義するために、それらを使用することができます。 データ・テンプレートは、どんなUIロジック(分離コード)も必要としない、ビューに制限されます。 視覚的にデータ・テンプレートを設計して、編集するために、 Visual Studio 2013のためのMicrosoft Blendは、使用することができます。

次に示す例は、顧客のリストに結合されるItemsControlを示しています。 基盤となるコレクションの中のそれぞれの利用者のオブジェクトは、View Modelインスタンスです。 顧客のためのビューは、インライン・データ・テンプレートによって定義されています。 次の例では、それぞれの顧客のView Modelのためのビューは、 StackPanelのラベルとView ModelでNameプロパティに結合されるテキストボックス・コントロールから構成されています。


<ItemsControl ItemsSource="{Binding Customers}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock VerticalAlignment="Center" Text="Customer Name: " />
                <TextBox Text="{Binding Name}" />
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

また、あなたは、リソースとして、データ・テンプレートを定義することができます。 次の例は、データ・テンプレートが、リソースを定義し、 StaticResourceマークアップ拡張機能によってコンテンツ・コントロールに適用することを示しています。


<UserControl ...>
    <UserControl.Resources>
        <DataTemplate x:Key="CustomerViewTemplate">
            <local:CustomerContactView />
        </DataTemplate>
    </UserControl.Resources>

    <Grid>
        <ContentControl Content="{Binding Customer}"
                ContentTemplate="{StaticResource CustomerViewTemplate}" />
    </Grid>
</UserControl>

ここで、データ・テンプレートは、具体的なビュー型をラップします。これは、ビューが、分離コードの動作を定義できます。 このように、データ・テンプレートの仕組みは、ViewとView Modelの間で、関連付けを外部的に提供するために使用することができます。 前述の例は、UserControlリソースでテンプレートを示しますが、それは、多くの場合、再使用のために、アプリケーション・リソースに配置されます。

Copyright (C) 2011-2016 kukekko All Rights Reserved.
kukekko@gmail.com
ご連絡の際はアドレスの@は半角にしてください。 また、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません 」。
inserted by FC2 system