Home > C# > UIパターン > Prism > Prismチュートリアル

Prism Library 5.0 for WPFを使用したコマンドのクイックスタート

新規作成日 2016-06-07
最終更新日

※サンプルコードのダウンロードは、原文リンクから行ってください。

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

Commanding QuickStart Using the Prism Library 5.0 for WPF (原文

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

CommandingのQuickStartのサンプルは、どのように、Prismライブラリで、分離された方法でUIの動作を処理するために、 提供されるデリゲートと複合コマンドを使用するWindows Presentation Foundation (WPF)アプリケーションを構築するかを説明します。 Model-View-ViewModel(MVVM)パターンを実装するとき、これは役に立ちます。 また、Prismライブラリは、ICommandインターフェイスの実装を提供します。

実際の使い方

Business Scenario

CommandingのQuickStartは、架空の製品発注システムに基づいています。メイン・ウィンドウは、より大規模なシステムのサブセットを示しています。 このウィンドウの中で、ユーザーは、顧客の注文を配置し、そして、それらを提出することができます。次に示す図は、QuickStartのメイン・ウィンドウを示しています。

命令のクイックスタート

命令のクイックスタート

Commanding QuickStart

このQuickStartは、実行するために、Visual Studio 2012、あるいは、それ以後と.NET Framework 4.5.1を必要とします。

QuickStartを構築して、実行するには、

To build and run the QuickStart

  1. Visual Studioでは、ソリューション・ファイルQuickstarts\Commanding\Commanding_Desktop.slnを開きます。
  2. Buildメニューで、Rebuild Solutionをクリックします。
  3. QuickStartを実行するために、F5を押してください。

実装の詳細

Implementation Details

QuickStartは、コマンドを使用した、アプリケーションの重要な実装の詳細を強調しています。次の図は、アプリケーションの主要な成果物を示しています。

CommandingのQuickStartの概念ビュー

CommandingのQuickStartの概念ビュー

Commanding QuickStart conceptual view

備考

QuickStartには、コードの重要な概念の案内を助けるために、多くのToDoコメントが含まれています。 Visual Studioで、Task Listウィンドウを使用するには、コードのこれらの重要な領域のリストを参照してください。 あなたが、ドロップダウン・ボックスで、Commentsを選択していることを確認します。 あなたが、リスト内の項目をダブルクリックする場合、コード・ファイルは、該当する行で開きます。

デリゲート・コマンド

Delegate Commands

DelegateCommandコマンドを使用して、あなたは、ExecuteとCanExecuteメソッドのために、デリゲートを与えることができます。 ExecuteやCanExecuteメソッドが、コマンドで呼び出されるとき、あなたが指定したデリゲートは、呼び出されることを示しています。

CommandingのQuickStartでは、各々の注文フォ-ムの上のSaveボタンは、デリゲート・コマンドに関連付けられています。 それぞれ、ExecuteとCanExecuteメソッドのためのデリゲートは、OrderViewModelクラスのSaveとCanSaveメソッドです。(このクラスは、注文のためのView Modelです。; クラス定義のための、ファイルCommanding.Modules.Order.Desktop\ViewModels\OrderViewModel.csを参照してください。)。

次に示すコードは、OrderViewModelクラスのコンストラクタを示しています。 メソッド・ボディで、SaveOrderCommandという名前の、デリゲート・コマンドが作成されます。 -それは、パラメータとして、SaveとCanSaveメソッドのためのデリゲートを渡します。

C#



public OrderViewModel( Services.Order order )
{
    _order = order;

    //TODO: 01 - Each Order defines a Save command.
// ToDo:01-各々のOrderは、Saveコマンドを定義します。
    this.SaveOrderCommand = new DelegateCommand<object>( this.Save, this.CanSave );

    // Track all property changes so we can validate.
// このように、私たちが検証することができる、すべてのプロパティの変更を追跡します。
    this.PropertyChanged += this.OnPropertyChanged;

    this.Validate();
}

次に示すコードは、SaveとCanSaveメソッドの実装を示しています。

C#


private bool CanSave( object arg )
{
    //TODO: 02 - The Order Save command is enabled only when all order data is valid.
// ToDo:02-すべての注文データが妥当な時だけ、Order Saveコマンドは有効にされます。
    // Can only save when there are no errors and
// エラーがない場合、保存だけを行うことができます。そして、
    // when the order quantity is greater than zero.
   //注文数量がゼロよりも大きい場合、
    return this.errors.Count == 0 && this.Quantity > 0;
}

private void Save( object obj )
{
    // Save the order here.
// 注文は、ここで保存します。
    Console.WriteLine( 
       String.Format( CultureInfo.InvariantCulture, "{0} saved.", this.OrderName ) );

    // Notify that the order was saved.
    // 注文が保存されたと、それに知らせます。
    this.OnSaved( new DataEventArgs<OrderPresentationModel>( this ) );
}

次に示すコードは、OnPropertyChangedメソッドの実装を示しています。このメソッドは、PropertyChangedイベントのためのイベントハンドラです。 それは、ユーザーが、注文フォ-ムの値を変更するたびに、呼び出されます。 このメソッドは、注文の合計を更新し、データを検証し、そして、状態の変更について、コマンドの呼び出しに知らせるために、 SaveOrderCommandコマンドのCanExecuteChangedイベントを発生させます。

C#


private void OnPropertyChanged( object sender, PropertyChangedEventArgs e )
{
    // Total is a calculated property based on price, quantity and shipping cost.
    //合計は、価格、量と送料に基づいて、計算されたプロパティです。
    // If any of these properties change, then notify the view.
    // これらのプロパティが、変更された場合、続いて、Viewに知らせます。
    string propertyName = e.PropertyName;
    if ( propertyName == "Price" || propertyName == "Quantity" || propertyName == "Shipping" )
    {
        this.NotifyPropertyChanged( "Total" );
    }

    // Validate and update the enabled status of the SaveOrder
    // SaveOrderのenabledステータスを検証して、更新します。
    // command whenever any property changes.
    // どんなプロパティでも変更するときはいつでも、コマンドの。
    this.Validate();
    this.SaveOrderCommand.RaiseCanExecuteChanged();
}

ファイルCommanding.Modules.Order.Desktop\Views\OrdersEditorView.xamlに配置されている次のコードは、 Saveボタンが、SaveOrderCommandコマンドに、どのように、結合されるかを表示します。

XAML


<Button AutomationProperties.AutomationId="SaveButton" Grid.Row="6" Grid.Column="1" Content="Save" Command="{Binding SaveOrderCommand}"></Button>

複数の要素で構成されたコマンド

Composite Commands

CompositeCommandは、複数の子コマンドがあるコマンドです。CompositeCommandは、中心となるツールバー上で、 Save AllボタンのためのCommandingのQuickStart内で使用されます。 あなたが、Save Allボタンをクリックすると、SaveAllOrdersCommand複合コマンドが、実行されます。 そして、結果として、すべてのその子のコマンド-SaveOrderCommandコマンド-は、各々の未解決の注文のために、実行されます。

SaveAllOrdersCommandコマンドは、グローバルに利用できるコマンドです。 そして、それは、OrdersCommandsクラス内で定義されます。 (クラス定義はCommanding.Modules.Order.Desktop\OrdersCommands.csで配置されます)。 次に示すコードは、OrdersCommands staticクラスの実装を示しています。

C#


public static class OrdersCommands
{
    public static CompositeCommand SaveAllOrdersCommand = new CompositeCommand();
}

ファイルCommanding.Modules.Order.Desktop\ViewModels\OrdersEditorViewModel.csから抜き出された次のコードは、 子のコマンドが、SaveAllOrdersCommandコマンドで、どのように登録されるかを示しています。 この場合、プロキシ・クラスは、コマンドを呼び出すために使用されます。 詳細は、このトピック後半の「グローバルコマンドのためのプロキシ・クラス」を参照してください。

C#


private void PopulateOrders()
{
    _orders = new ObservableCollection<OrderPresentationModel>();

    foreach ( Services.Order order in this.ordersRepository.GetOrdersToEdit() )
    {
        // Wrap the Order object in a presentation model object.
// OrderオブジェクトをプレゼンテーションModelオブジェクトでラップします。
        var orderPresentationModel = new OrderViewModel( order );
        _orders.Add( orderPresentationModel );

        // Subscribe to the Save event on the individual orders.
    // それぞれの注文上で、Saveイベントを購読します。
        orderPresentationModel.Saved += this.OrderSaved;

        //TODO: 04 - Each Order Save command is registered with the application's SaveAll command.
    // ToDo:04-各々のOrder Saveコマンドは、アプリケーションのSaveAllコマンドで登録されます。
        commandProxy.SaveAllOrdersCommand.RegisterCommand( orderPresentationModel.SaveOrderCommand );
    }
}

注文が保存されるとき、その個々の注文のためのSaveOrderCommand子コマンドが、登録されている必要があります。 次のコードは、注文が保存されるとき、実行される、OrderSavedイベントハンドラの実装内で、どのように、これが実行されるかを示しています。

C#


private void OrderSaved(object sender, DataEventArgs<OrderViewModel> e)
{
    if (e != null && e.Value != null)
    {
        OrderViewModel order = e.Value;
        if (this.Orders.Contains(order))
        {
            order.Saved -= this.OrderSaved;
            this.commandProxy.SaveAllOrdersCommand.UnregisterCommand(order.SaveOrderCommand);
            this.Orders.Remove(order);
        }
    }
}

次のXAMLマークアップ・コードは、ツールバー内のSaveAllOrdersCommandコマンドが、 どのように、SaveAllToolBarButtonボタンに結合されるかを示しています。 このコードは、Commanding.Modules.Order.Desktop\OrdersToolBar.xamlに配置されています。

XAML


<ToolBar>
  <Button AutomationProperties.AutomationId="SaveAllToolBarButton" Command="{x:Static inf:OrdersCommands.SaveAllOrdersCommand}">Save All Orders</Button>
  <Separator />
</ToolBar>

グローバルコマンドのためのプロキシ・クラス

Proxy Class for Global Commands

グローバルに利用できるコマンドを作成するために、一般的にあなたは、CompositeCommandクラスの静的インスタンスを作成します。 そして、静的クラスを通じて、公的にそれを公開します。 この方法は、あなたが、コードから、直接、コマンドのインスタンスを呼び出すことができるため、理解しやすいです。 しかしながら、この方法は、あなたのクラスが、コマンドに密接に結合されているため、 分離してテストすることが、難しいコマンドを使用するあなたのクラスを作成します。テスト容易性が、 アプリケーションの懸念であるとき、プロキシ・クラスは、グローバルコマンドを呼び出すために使用することができます。 プロキシ・クラスは、ユニット・テストを記述するとき、簡単に、モック実装に置き換えることができます。

CommandingのQuickStartは、SaveAllOrdersCommandへのアクセスをカプセル化する、 OrdersCommandProxyという名前のプロキシ・クラスを実装しています。 (クラス定義はCommanding.Modules.Order.Desktop\OrdersCommands.csで配置されます)。 次のコードで示されるクラスは、OrdersCommandsクラスで定義した SaveAllOrdersCommandsコマンドのインスタンスを返すために、公開されるプロパティを実装しています。

C#


public class OrdersCommandProxy
{
    public virtual CompositeCommand SaveAllOrdersCommands
    {
        get { return OrdersCommands.SaveAllOrdersCommand; }
    }
}

前述のコードで、SaveAllOrdersCommandsプロパティが、モック・コマンドを返すために、モック・クラスで上書きできることに、注意してください。

グローバルに利用できるコマンドを作成するに関する詳細は、疎く結合したコンポーネントの間で情報をやりとりする内の、 グローバルに利用できるコマンドへのバインディング(原文)を参照してください。

受入検査

Acceptance Tests

CommandingのQuickStartには、受入検査が含まれている分離したソリューションが含まれています。 受入検査では、あなたが、一連の手順に従うとき、アプリケーションが、どのように動作する必要があるかを説明します。 あなたは、さまざまな使い方をする、アプリケーションの機能の挙動を調べるために、受入検査を使用することができます。

CommandingのQuickStart受入検査を実行します

To run the Commanding QuickStart acceptance tests

  1. Visual Studioでは、ソリューション・ファイルQuickStarts\Commanding\Commanding.Tests.AcceptanceTest\Commanding.Tests.AcceptanceTest.slnを開きます。
  2. ソリューションを構築します。
  3. Test Explorerを開きます。
  4. ソリューションを構築した後、Visual Studioは、テストを捜し出します。受入検査を実行するために、Run Allボタンをクリックします。

結論

あなたは、ウィンドウのQuickStartを参照する必要があります。そして、テストは、自動的に、アプリケーションと相互作用します。 テスト実行の終了時に、あなたは、すべてのテストが渡されたことを確かめる必要があります。

詳細情報

以前のバージョンのドキュメント

旧バージョン向けの和訳されたドキュメントのリンクです。

コマンド処理のクイックスタート(外部サイト)

このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」