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

Prism Library 5.0 for WPFを使用したインタラクティブ性のクイックスタート

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

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

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

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

Interactivity QuickStart user interface

クイックスタートを構築して、そして、実行する

Building and Running the QuickStart

このクイックスタートは、.Net Framework 4.5.1、Microsoft Visual Studio 2012以降とBlend for Visual Studio 2013を必要とします。

インタラクティブ性のQuickStartを構築して、実行するには、:

  1. Visual Studioで、ソリューション・ファイルQuickStart\Interactivity\InteractivityQuickstart.slnを開きます。
  2. Buildメニューで、Rebuild Solutionをクリックします。
  3. 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

既定の通知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

既定の確認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

カスタム・ポップアップ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

より複雑な相互作用を持つカスタム・ポップアップ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の受入検査を実行するには

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

結論

Outcome

あなたが、受入検査を実行するとき、あなたは、ウィンドウのQuickStartを参照する必要があります。 そして、テストは、自動的に、ユーザー・インターフェイスと相互作用します。 テストが渡された最後に、あなたは、すべてのテストが渡されたことを確かめる必要があります。

詳細情報

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

Home PC C# Illustration

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