※サンプルコードのダウンロードは、原文リンクから行ってください。
パターンと実践 ディベロパー・センター
Interactivity QuickStart Using the Prism Library 5.0 for WPF(原文)
Microsoft Prism Library 5.0 for WPFの開発者のガイドから:
インタラクティブ性のQuickStartは、ViewとView Modelが、どのように、ユーザーと相互作用することができるかを説明します。 これには、コントロールが配置されるViewで、View Modelと相互作用から発生する相互作用が含まれています。 これらの異なる相互作用を取り扱うPrismライブラリは、カスタムInvokeCommandAction動作と一緒に、 InteractionRequestsとInteractionRequestTriggersを提供します。 InvokeCommandActionは、イベントを含むトリガを、WPFコマンドに接続するために使用されます。
シナリオ
Scenarios
この項目では、インタラクティブ性のクイックスタートに含まれるシナリオを説明します。 クイックスタートは、3つのタブで構成されます。:Introduction、Interaction RequestsとInvokeCommandAction。
Introductionタブには、QuickStartの目的に関する情報が含まれています。 Interaction Requestsタブには、InteractionRequestsとInteractionRequestTriggersの使い方を説明する4つの異なるシナリオが含まれています。 View Modelが、ユーザーと相互作用する必要があるとき、 最後に、InvokeCommandActionタブは、コマンドが、View内のコントロールによって、発生するイベントに応じて、どのように、呼び出されるかを説明します。
次に示す図は、インタラクティブ性のQuickStartのメインページを示しています。
Interactivity QuickStart user interface
クイックスタートを構築して、そして、実行する
Building and Running the QuickStart
このクイックスタートは、.Net Framework 4.5.1、Microsoft Visual Studio 2012以降とBlend for Visual Studio 2013を必要とします。
インタラクティブ性のQuickStartを構築して、実行するには、:
- Visual Studioで、ソリューション・ファイルQuickStart\Interactivity\InteractivityQuickstart.slnを開きます。
- Buildメニューで、Rebuild Solutionをクリックします。
- QuickStartを実行するために、F5を押してください。
実装の詳細
Implementation Details
QuickStartは、ユーザーとの対話処理で、主要なコンポーネントを強調しています。次のセクションでは、クイックスタートの主要な成果物を説明します。
MVVMアプリケーションでは、ViewやView Modelが、ユーザーと相互作用するために、協力する必要があるシナリオがあります。
View Modelが、ユーザーと相互作用する必要があるとき、それは、この相互作用を、Viewに委ねる必要があります。View Modelは、 UIを操作してはいけないので、Prismは、これらのシナリオを取り扱うために、 Interaction RequestsとInteraction Request Triggersを提供します。
ユーザーが、UIで動作を行うとき、それは、ビジネス・ロジックを起動する必要がある、イベントを発生させます。このビジネス・ロジックは、 アプリケーション・ロジックの処理を担当しているView Modelに委ねる必要があります。 Prismは、このシナリオを支援する、InvokeCommandActionを提供します。
対話の要求
Interaction Requests
Prismは、ユーザーが応答する必要があるView Modelで、メソッドとして相互作用を操作を開始するために、Interaction Requestsを提供します。
通知の相互作用
Notification Interactions
View Modelは、InteractionRequestのインスタンスを格納するプロパティを定義する必要があります。; この例では、それは、NotificationRequestが、呼び出されます。 そして、一般的に、View Modelのコンストラクタで初期化されます。 InteractionRequestが、INotification型であることに注意します。 それは、通知のために使用される対話要求を表現します。
C#
public InteractionRequest<INotification> NotificationRequest { get; private set; }
View Modelは、相互作用を起動します。RaiseNotificationCommandが、 RaiseNotificationメソッドを呼び出すとき、相互作用は、相互作用が完了するとき、それは、実行されるコールバックと同様に、 Notificationインターフェイスの実装を受け取るInteractionRequestインスタンスのRaiseメソッドを使用して呼び出されます。 この例では、INotificationインターフェイスの既定の実装-Notificationクラス-が使用されます。
C#
private void RaiseNotification()
{
this.NotificationRequest.Raise(
new Notification { Content = "Notification Message", Title = "Notification" },
n => { InteractionResultMessage = "The user was notified."; });
}
Notificationクラスのインスタンスを作成するとき、ContentとTitleプロパティが指定されます。 Contentは、通知メッセージです。そして、Titleは、ポップアップウィンドウのキャプションです。
次のコードで示すように、対話要求を使用するために、ViewのXAMLのコードで、 あなたが、対応するInteractionRequestTriggerを定義する必要があります。
XAML
<prism:InteractionRequestTrigger SourceObject="{Binding NotificationRequest, Mode=OneWay}">
<prism:PopupWindowAction IsModal="True" CenterOverAssociatedObject="True"/>
</prism:InteractionRequestTrigger>
InteractionRequestTriggerが、SourceObjectプロパティがあることに注意します。 それは、View Model内の、InteractionRequestプロパティに結合されています。
InteractionRequestTriggerは、Prismで提供される、関連するPopupWindowActionを持っています。 それは、View Modelが、対話要求を発生するとき、実行しされるでしょう。 この動作は、すぐに使えるViewのいくつかを使用して、ポップアップウィンドウを表示するでしょう。 あるいは、あなたは、カスタム・ポップアップViewを指定することができます。 IsModalプロパティは、trueに設定されると、モーダルとして、このポップアップウィンドウを表示します。 そして、CenterOverAssociatedObjectプロパティは、trueに設定されると、親のViewの中央に、ポップアップウィンドウを表示します。
カスタム・ウィンドウが、例の中で指定されていなかったため、 次の図に示すように、Notificationsのために、すぐに使えるポップアップウィンドウが、使用されるでしょう。
既定の通知View
Default Notification View
相互作用の確認
Confirmation Interactions
Confirmation Interactionsは、ユーザーにメッセージを表示します。 相互作用を受け入れる、あるいは、キャンセルするために、2つのボタンが表示されます。
Confirmation Interactionを送信するために、あなたが、次のコードで確かめられるように、 それは、InteractionRequestインスタンスを保持するプロパティを宣言するとき、 InteractionRequestプロパティをIConfirmation型と宣言します。
C#
public InteractionRequest<IConfirmation> ConfirmationRequest { get; private set; }
確認を発生させるために、コードは、通知するためのInteractionsに似ていますが、 ここでは、あなたは、Raiseメソッドに、Confirmationクラス・インスタンスを渡します。 Confirmationクラスは、IConfirmationインターフェイスの既定の実装です。
C#
private void RaiseConfirmation()
{
this.ConfirmationRequest.Raise(
new Confirmation { Content = "Confirmation Message", Title = "Confirmation" },
c => { InteractionResultMessage = c.Confirmed ? "The user accepted." : "The user cancelled."; });
}
コールバックに、注意してください。別の動作は、ユーザーの選択に応じて、実行することができます。
あなたが、次のコードの中で、見ることができるように、この例が、既定のポップアップウィンドウを使用するように、XAMLの定義は、Notification Interactionに似ています。
XAML
<prism:InteractionRequestTrigger SourceObject="{Binding ConfirmationRequest, Mode=OneWay}">
<prism:PopupWindowAction IsModal="True" CenterOverAssociatedObject="True"/>
</prism:InteractionRequestTrigger>
次の図は、既定の確認ポップアップウィンドウが表示されています。
既定の確認View
Default Confirmation view
カスタム・ポップアップウィンドウ
Custom pop-up windows
提供されるすぐに使えるそれらの代わりに、カスタム・ポップアップウィンドウを使用するために、 InteractionのXAML定義内の、PopupWindowActionアクションのWindowContentプロパティを使用します。 それを、あなたのカスタム・ポップアップウィンドウのインスタンスに設定します。これは、次のコード・スニペットで実際に示されます。
XAML
<prism:InteractionRequestTrigger SourceObject="{Binding CustomPopupViewRequest, Mode=OneWay}">
<prism:PopupWindowAction>
<prism:PopupWindowAction.WindowContent>
<views:CustomPopupView />
</prism:PopupWindowAction.WindowContent>
</prism:PopupWindowAction>
</prism:InteractionRequestTrigger>
対話の要求インスタンスのRaiseメソッドへの呼び出しは、正規の通知と同様、同じものです。 この場合、私たちは、パラメータとして、簡単な通知を渡しています。カスタム・ポップアップViewは、独自のDataContextを持っていません。; その結果、それは、次のコードで示される、ウィンドウのDataContextとして、渡される通知オブジェクトを継承します。
C#
private void RaiseCustomPopupView()
{
this.InteractionResultMessage = "";
this.CustomPopupViewRequest.Raise(
new Notification { Content = "Message for the CustomPopupView", Title = "Custom Popup" });
}
次の図は、Notificationインスタンス・プロパティを使用する動作のカスタム・ポップアップウィンドウを表示します。
カスタム・ポップアップView
A custom popup view
複雑なカスタムPopupウィンドウ
Complex Custom Popup Windows
あなたが、カスタム・ポップアップウィンドウを表示したい場合、それには、より複雑な機能が含まれています。 あなたは、カスタムView Modelを、あなたのポップアップViewに設定することができます。
次の例では、PopupWindowActionアクションは、カスタムViewを定義します。 この動作が、実行されると、Viewは、新しいウィンドウ内に、表示されます。
XAML
<prism:InteractionRequestTrigger SourceObject="{Binding ItemSelectionRequest, Mode=OneWay}">
<prism:PopupWindowAction>
<prism:PopupWindowAction.WindowContent>
<views:ItemSelectionView />
</prism:PopupWindowAction.WindowContent>
</prism:PopupWindowAction>
</prism:InteractionRequestTrigger>
備考
そのViewをアカウントに渡し、そして、そのView Modelは、一度だけ、作成され、そして、動作が、実行されるたびに、再利用されます。
あなたのカスタム・ポップアップView Modelは、相互作用を完了するために、呼び出すことができる動作と同様に、対話の要求から通知オブジェクトを取得するために、 IInteractionRequestAwareインターフェイスを実装する必要があります。あなたは、次のコードで、インターフェイスのメンバーを見ることができます。
C#
public interface IInteractionRequestAware
{
INotification Notification { get; set; }
Action FinishInteraction { get; set; }
}
カスタムView Modelクラスは、コード・スニペットで示すように、このインターフェイスを実装します。
C#
public class ItemSelectionViewModel : BindableBase, IInteractionRequestAware
{
private ItemSelectionNotification notification;
public ItemSelectionViewModel()
{
this.SelectItemCommand = new DelegateCommand(this.AcceptSelectedItem);
this.CancelCommand = new DelegateCommand(this.CancelInteraction);
}
public Action FinishInteraction { get; set; }
public INotification Notification
{
get
{
return this.notification;
}
set
{
if (value is ItemSelectionNotification)
{
this.notification = value as ItemSelectionNotification;
this.OnPropertyChanged(() => this.Notification);
}
}
}
public string SelectedItem { get; set; }
public ICommand SelectItemCommand { get; private set; }
public ICommand CancelCommand { get; private set; }
public void AcceptSelectedItem()
{
if (this.notification != null)
{
this.notification.SelectedItem = this.SelectedItem;
this.notification.Confirmed = true;
}
this.FinishInteraction();
}
public void CancelInteraction()
{
if (this.notification != null)
{
this.notification.SelectedItem = null;
this.notification.Confirmed = false;
}
this.FinishInteraction();
}
}
前述のコードで、その値が、更新されるとき、Notificationプロパティが、OnPropertyChangedイベントを呼び出すことに注意してください。
カスタム・ポップアップView Modelに、情報を渡すために、カスタムConfirmationクラスは、作成されます。 Confirmationクラスは、決定することができるConfirmedプロパティを利用するために、ユーザーが、項目を選択する、 あるいは、ダイアログを閉じる場合、Notificationクラスの代わりに使用されます。 このクラスを、データ転送オブジェクト(DTO)と考えます。それは、ポップアップViewが必要とするプロパティが含まれています。
C#
public class ItemSelectionNotification : Confirmation
{
public ItemSelectionNotification()
{
this.Items = new List<string>();
this.SelectedItem = null;
}
public ItemSelectionNotification(IEnumerable<string> items)
: this()
{
foreach(string item in items)
{
this.Items.Add(item);
}
}
public IList<string> Items { get; private set; }
public string SelectedItem { get; set; }
}
あなたが、あなたのView Model内の、対話要求プロパティを定義するとき、 あなたは、次のコードで確かめられるように、ItemSelectionNotification型として、 あるいは、あなたが必要とするカスタム通知型のどれでも、それを定義します。
C#
public InteractionRequest<ItemSelectionNotification> ItemSelectionRequest { get; private set; }
最後に、あなたが、対話の要求を発生させると、あなたは、あなたのカスタムNotificationのインスタンス(この例では、 ItemSelectionNotificationクラス)を作成するでしょう。そして、それを作業するために、必要とされるデータを追加します。 この場合、埋め込まれたリストが、対応するItemsプロパティに追加される項目に注意してください。
C#
private void RaiseItemSelection()
{
ItemSelectionNotification notification = new ItemSelectionNotification();
notification.Items.Add("Item1");
notification.Items.Add("Item2");
notification.Items.Add("Item3");
notification.Items.Add("Item4");
notification.Items.Add("Item5");
notification.Items.Add("Item6");
notification.Title = "Items";
this.InteractionResultMessage = "";
this.ItemSelectionRequest.Raise(notification,
returned =>
{
if (returned != null && returned.Confirmed && returned.SelectedItem != null)
{
this.InteractionResultMessage = "The user selected: " + returned.SelectedItem;
}
else
{
this.InteractionResultMessage = "The user cancelled the operation or didn't select an item.";
}
});
}
カスタム・ポップアップViewは、それ自体のIInteractionRequestAwareインターフェイスを実装するView Modelを持っています。; その結果、そのNotificationプロパティは、PopupWindowActionによって、自動的に、この通知と一緒に埋め込まれます。
この方法では、親のViewのView ModelとポップアップウィンドウのView Modelは、互いに直接参照なしでデータを交換し合うことができます。
次の図では、あなたは、より複雑な機能を提供する、カスタム・ポップアップViewを見ることができます。
より複雑な相互作用を持つカスタム・ポップアップView
A custom popup view with a more complex interaction
InvokeCommandAction
InvokeCommandAction
あなたが、Viewに配置されるコントロールのイベントの発生に応じて、コマンドを呼び出す必要があるとき、 あなたは、BlendのInvokeCommandActionを使用することができます。
InvokeCommandActionは、起動されたイベントに応じて、コマンドを実行することができます。 しかしながら、あなたは、コマンド・パラメータとして、EventArgsの全部、あるいは、一部を渡すことができません。 Prismは、この場合、あなたを助けることができる、カスタムInvokeCommandAction動作を提供しています。 それは、TriggerParameterPathと呼ばれる、追加のプロパティを持っています。 それは、発生したイベントのEventArgsのメンバーを指定するために、使用されます。それは、コマンド・パラメータとして渡されます。 また、InvokeCommandActionは、コマンドのCanExecuteから戻される値に基づいた、 関連するコントロールのisEnabledプロパティを設定します。
InvokeCommandAction動作を使用するために、イベントが、コントロールによって呼び出されるとき、ビュー内で、 あなたは、InvokeCommandActionを実行するEventTriggerのような、トリガを登録するでしょう。 この動作は、動作を起動したイベントの、指定されたパラメータを渡しているコマンドを実行します。 あなたは、次のコードで、これを確かめることができます。
XAML
<ListBox Grid.Row="1" Margin="5" ItemsSource="{Binding Items}" SelectionMode="Single">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<!-- This action will invoke the selected command in the view model and pass the parameters of the event to it. -->
<!-- この動作は、View Modelで選択されたコマンドを呼び出し、それにイベントのパラメータを渡します。 -->
<prism:InvokeCommandAction Command="{Binding SelectedCommand}" TriggerParameterPath="AddedItems" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
前述のコードで、トリガは、SelectionChangedイベントで、ListBoxコントロールをアクティブにするでしょう。 そして、InvokeCommandActionは、コマンド・パラメータとして、SelectionChangedEventArgsのAddedItemsプロパティを渡し 、SelectedCommandコマンドを実行するでしょう。 TriggerParameterPathプロパティが、設定されていない場合、SelectionChangedEventArgsインスタンスは、コマンドに直接渡されます。 CommandParameterプロパティが、設定された場合、トリガのパラメータは、無視されるでしょう。
主要なインタラクティブ性に対応するクラス
Key Interactivity Classes
以下は、インタラクティブ性のQuickStartで使用される、いくつかの重要なクラスです。:
- IInteractionRequest。インターフェイスは、ユーザーとの対話処理のための要求を表示します。 View modelは、プロパティを通して、対話の要求オブジェクトを公開することができます。 そして、ユーザーとの対話処理が必要となるとき、それらを発生させます。 そのため、ViewModelに関連したViewは、適切な仕組みを使用して、ユーザーとの対話処理を実現することができます。
- InteractionRequest
.IInteractionRequestインターフェイスの実装。 - INotification。インターフェイスは、通知のための使用した対話の要求を表示します。
- Notification.TitleとContentプロパティが含まれているINotificationの基本的な実装。
- IConfirmation。確認のために使用される対話の要求を表示します。それは、確認が受け入れられる、 あるいは、そうでない場合を示すConfirmedプロパティが含まれています。
- Confirmation。IConfirmationの基本的な実装。また、それは、Notificationクラスから継承しています。
- IInteractionRequestAware。PopupWindowActionクラスによって使用されるインターフェイス。 この動作で表示されるViewのDataContextオブジェクトが、このインターフェイスを実装する場合、 それは、呼び出しの要求を完了させるための動作と同様に、対話の要求のINotificationデータと一緒に埋め込まれるでしょう。
- InvokeCommandAction。起動動作は、呼び出されると、 コマンド・パラメータとして使用されるトリガのパラメータの子のプロパティを識別するために解析されるTriggerParameterPathプロパティが含まれているコマンドを実行します。
受入検査
Acceptance Tests
インタラクティブ性のQuickStartには、分離した受入検査のソリューションが含まれています。 受入検査では、あなたが、一連の手順に従うとき、アプリケーションが、どのように動作する必要があるかを説明します。 あなたは、さまざまな使い方をする、アプリケーションの機能的挙動を調べるために、受入検査を使用することができます。
インタラクティブ性のQuickStartの受入検査を実行するには
- Visual Studioでは、QuickStarts\Interactivity\Interactivity.Tests.AcceptanceTest\Interactivity.Tests.AcceptanceTest.slnソリューション・ファイルを開きます。
- ソリューションを構築します。
- Test Explorerを開きます。
- ソリューションを構築した後、Visual Studioは、テストを捜し出します。受入検査を実行するために、Run Allボタンをクリックします。
結論
Outcome
あなたが、受入検査を実行するとき、あなたは、ウィンドウのQuickStartを参照する必要があります。 そして、テストは、自動的に、ユーザー・インターフェイスと相互作用します。 テストが渡された最後に、あなたは、すべてのテストが渡されたことを確かめる必要があります。
詳細情報
More Information
インタラクティブ性の詳細については、ユーザー・インターフェイスを構成するを参照してください。