※サンプルコードのダウンロードは、原文リンクから行ってください。
パターンと実践 ディベロパー・センター
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
- Visual Studioでは、ソリューション・ファイルQuickstarts\Commanding\Commanding_Desktop.slnを開きます。
- Buildメニューで、Rebuild Solutionをクリックします。
- QuickStartを実行するために、F5を押してください。
実装の詳細
Implementation Details
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
- Visual Studioでは、ソリューション・ファイルQuickStarts\Commanding\Commanding.Tests.AcceptanceTest\Commanding.Tests.AcceptanceTest.slnを開きます。
- ソリューションを構築します。
- Test Explorerを開きます。
- ソリューションを構築した後、Visual Studioは、テストを捜し出します。受入検査を実行するために、Run Allボタンをクリックします。
結論
あなたは、ウィンドウのQuickStartを参照する必要があります。そして、テストは、自動的に、アプリケーションと相互作用します。 テスト実行の終了時に、あなたは、すべてのテストが渡されたことを確かめる必要があります。
詳細情報
More Information
コマンドの詳細については、次のトピックを参照してください。:
- 株トレーダーの参考になる実装
- モジュール方式のクイックスタート
- インタラクティブ性のクイックスタート
- MVVMクイックスタート
- UI構成のクイックスタート
- 状態に基づいたナビゲーションのクイックスタート
- 表示を切り替えるナビゲーションのクイックスタート
- イベント集約のクイックスタート
- MVVMパターンを実装する
- 疎く結合したコンポーネント間の通信(原文)
Prismに含まれる、他のコードサンプルについて学ぶためには、次のトピックを参照してください。:
以前のバージョンのドキュメント
旧バージョン向けの和訳されたドキュメントのリンクです。
コマンド処理のクイックスタート(外部サイト)