7.Prism_ダイアログのパラメータ渡し(受け取り)

こんにちは、ゆたんぽです。

前回の記事でPrismでのダイアログの表示方法を説明してきました。

今回は、ダイアログを表示するときにパラメータを渡す方法を説明していきます。

ダイアログのパラメータ渡し

値を渡す側の設定

まずは、値を渡す方法です。

値を渡すので、画面を表示する側ですね。

画面を表示するのは、メイン側なのでMainWondowViewModel.csに実装をしていきます。

using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs; 
using Sample.Views;
using System;

namespace Sample.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private readonly IRegionManager _regionManager;

        private readonly IDialogService _dialogService;

        private string _title = "Sample Application";

        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        private string _systemData = DateTime.Now.ToString("yyyy年MM月dd日  HH時mm分ss秒");

        public string SystemData
        {
            get { return _systemData; }

            set { SetProperty(ref _systemData, value); }
        }

        public DelegateCommand UpdateButton { get; }

        public DelegateCommand ShowView1Button { get; }

        public DelegateCommand ShowView2Button { get; }

        public DelegateCommand ShowView3Button { get; }

        public MainWindowViewModel(IRegionManager regionManager,IDialogService dialogService) //③
        {
            _regionManager = regionManager;

            _dialogService = dialogService;

            UpdateButton = new DelegateCommand(UpdateButtonExe);

            ShowView1Button = new DelegateCommand(ShowView1ButtonExe);

            ShowView2Button = new DelegateCommand(ShowView2ButtonExe);

            ShowView3Button = new DelegateCommand(ShowView3ButtonExe); 
        }

        private void UpdateButtonExe()
        {
            SystemData = DateTime.Now.ToString("yyyy年MM月dd日  HH時mm分ss秒");
        }

        private void ShowView1ButtonExe()
        {
            _regionManager.RequestNavigate("ContentRegion",nameof(View1));
        }

        private void ShowView2ButtonExe()
        {
            var p = new NavigationParameters();

            p.Add(nameof(View2ViewModel.View2Label),SystemData);

            _regionManager.RequestNavigate("ContentRegion", nameof(View2),p);
        }

        private void ShowView3ButtonExe()
        {
            var p = new DialogParameters();
            p.Add(nameof(View3ViewModel.View3TextBox),SystemData);
            _dialogService.ShowDialog(nameof(View3),p,null);
        }

    }
}

まず、パラメータを渡すDialogParametersをpで定義します。

次にp.Addでパラメータを追加しています。

第1引数に受け渡す際のキーワードを定義して、第2引数に実際受け渡すデータを宣言します。

最後に、ダイアログを開くメソッドであるShowDialogの第2引数にパラメータを追加して、渡す側の準備は終了です。

値をもらう側の設定

もらう側は、View3ViewModelに定義していきます。

前回の記事の「IDialogAwareの実装」で説明した「OnDialogOpened」を使用して、パラメータの受け取りを行います。

using Prism.Commands;
using Prism.Mvvm;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Sample.ViewModels
{
    public class View3ViewModel : BindableBase,IDialogAware
    {
        public View3ViewModel()
        {

        }

        private string _view3TextBox = "Test";

        public event Action<IDialogResult> RequestClose;

        public string View3TextBox
        {
            get { return _view3TextBox; }

            set { SetProperty(ref _view3TextBox, value); }
        }

        public string Title => "View3Title";

        public bool CanCloseDialog()
        {
            return true;
        }

        public void OnDialogClosed()
        {

        }

        public void OnDialogOpened(IDialogParameters parameters)
        {
            View3TextBox = parameters.GetValue<string>(nameof(View3TextBox));
        }
    }
}

何の記載もなかった「OnDialogOpened」で、事前に用意していたView3TextBoxにパラメータを格納します。

受け取ったparametersに用意されている、GetValueメソッドを使用します。

<>には、受け取るパラメータの型を入れます。今回は、String型ですので<string>としています。

引数には、先ほどMainWondowViewModel.csで定義したキーワードの”nameof(View3TextBox)”を入れることでパラメータを受け取ることができます。

この状態でデバッグを開始すると、Dialogが表示された際にパラメータの受け渡しができていることがわかります。

システム日時で取得した値と同じ内容がView3のテキストボックスに表示されていれば成功です。

以上でダイアログでのパラメータ私の説明を終わります。


ダイアログ画面からパラメータを受け取る方法

続いてダイアログ画面を閉じた際に、ダイアログからパラメータを受け取る方法を説明していきます。

View3の実装

まず、”OK”というボタンを作成していきます。

<UserControl x:Class="Sample.Views.View3"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:prism="http://prismlibrary.com/"             
             prism:ViewModelLocator.AutoWireViewModel="True">
    <Grid>
        <StackPanel>
            <Label Content="View3" 
                FontSize="40"
                   Foreground="Green"/>
            <TextBox Text="{Binding View3TextBox}"/>
            <Button Content="OK"
                    Command="{Binding OKButton}"/>
        </StackPanel>  
    </Grid>
</UserControl>

上記のようにOKという名前のボタンに”OKButton”のコマンドをデータバインディングします。


View3ViewModelの実装

次に、先ほど作成した”OKButton”のデータバインドを実装と「ダイアログからパラメータを渡す」内容を記述します。

using Prism.Commands;
using Prism.Mvvm;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Linq;

namespace Sample.ViewModels
{
    public class View3ViewModel : BindableBase,IDialogAware
    {
        public View3ViewModel()
        {
            OKButton = new DelegateCommand(OKButtonExe);//②
        }

        public DelegateCommand OKButton { get; }//①

        private string _view3TextBox = "Test";

        public event Action<IDialogResult> RequestClose;

        public string View3TextBox
        {
            get { return _view3TextBox; }

            set { SetProperty(ref _view3TextBox, value); }
        }

        public string Title => "View3Title";

        public bool CanCloseDialog()
        {
            return true;
        }

        public void OnDialogClosed()
        {

        }

        public void OnDialogOpened(IDialogParameters parameters)
        {
            View3TextBox = parameters.GetValue<string>(nameof(View3TextBox));
        }

        private void OKButtonExe()//③
        {
            var p = new DialogParameters();
            p.Add(nameof(View3TextBox),View3TextBox);
            RequestClose?.Invoke(new DialogResult(ButtonResult.OK,p));
        }
    }
}

上記で追加した項目を順に説明していきます。

①View3側で設定した「OKButton」のコマンドをDelegateCommandで作成します。

②コンストラクタで実際に動かす関数を定義します。今回は、「OKButtonExe」としました。

③ ②で宣言した「OKButtonExe」を実装します。まずは、例のごとくdialogParametersをpで作成します。
次に、pにパラメータを追加します。今回は、View3TextBoxというキーワードでView3TextBoxの値を追加しています。最後に定義した、「RequestClose?.Invoke」で画面を閉じることができます。
画面を閉じる際に引数で宣言する「DialogResult」が通知される仕組みとなっています。
DialogResult では、押されたボタンの意味とdialogParametersが設定できます。そのため、OKが押されたのか、キャンセルが押されたのか、という内容をここで定義することができます。
今回は、OKボタンを定義しています。

MainWondowViewModelの実装

次にパラメータを受け取る側の実装をしていきます。

using Prism.Commands;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs; 
using Sample.Views;
using System;

namespace Sample.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        private readonly IRegionManager _regionManager;

        private readonly IDialogService _dialogService;

        private string _title = "Sample Application";

        public string Title
        {
            get { return _title; }
            set { SetProperty(ref _title, value); }
        }

        private string _systemData = DateTime.Now.ToString("yyyy年MM月dd日  HH時mm分ss秒");

        public string SystemData
        {
            get { return _systemData; }

            set { SetProperty(ref _systemData, value); }
        }

        public DelegateCommand UpdateButton { get; }

        public DelegateCommand ShowView1Button { get; }

        public DelegateCommand ShowView2Button { get; }

        public DelegateCommand ShowView3Button { get; }

        public MainWindowViewModel(IRegionManager regionManager,IDialogService dialogService) //③
        {
            _regionManager = regionManager;

            _dialogService = dialogService;

            UpdateButton = new DelegateCommand(UpdateButtonExe);

            ShowView1Button = new DelegateCommand(ShowView1ButtonExe);

            ShowView2Button = new DelegateCommand(ShowView2ButtonExe);

            ShowView3Button = new DelegateCommand(ShowView3ButtonExe); 
        }

        private void UpdateButtonExe()
        {
            SystemData = DateTime.Now.ToString("yyyy年MM月dd日  HH時mm分ss秒");
        }

        private void ShowView1ButtonExe()
        {
            _regionManager.RequestNavigate("ContentRegion",nameof(View1));
        }

        private void ShowView2ButtonExe()
        {
            var p = new NavigationParameters();

            p.Add(nameof(View2ViewModel.View2Label),SystemData);

            _regionManager.RequestNavigate("ContentRegion", nameof(View2),p);
        }

        private void ShowView3ButtonExe()
        {
            var p = new DialogParameters();
            p.Add(nameof(View3ViewModel.View3TextBox),SystemData);
            _dialogService.ShowDialog(nameof(View3),p,View3Close);
        }

        private void View3Close(IDialogResult dialogResult)
        {
            if(dialogResult.Result == ButtonResult.OK)
            {
                SystemData = dialogResult.Parameters.GetValue<string>(nameof(View3ViewModel.View3TextBox));
            }
        }
    }
}

まず、先ほど紹介した「ダイアログの表示」メソッドのShowDialogで、第3引数に「View3Close」という名前のものを定義していきます。

次に、 「View3Close」 にカーソルを持っていき、「Ctrl+ . 」でメソッドの自動生成を行います。

つぎに自動生成された「View3Close」メソッドの中身を記述していきます。

まず、ifを使用して、先ほど画面を閉じる時に押されたボタンの中身(OK)を確認しています。

次にOKであることが確認してできたら、SystemDateにパラメータを受け取る記述を行っています。

ここは、今までと同様なので割愛させていただきます。

ここまで来たら、デバッグを開始してみてください。

ダイアログが表示されたら、上記のようにTextBoxを任意の値に変更して、OKボタンを押してください。
すると、上記のようにシステム日時が入力した値に変更されていることがわかります。

これで、ダイアログの値の受け取りが成功です。


まとめ&次回予告

今回は、「ダイアログでのパラメータ渡し」と、「ダイアログを閉じた時にパラメータを受け取る方法」を説明していきました。

パラメータ渡しと受け取りができると実装するアプリでできることが広がると思います。

次回は、Prismでの「ListBox」のデータバインディングについて記事にしていこうと思いますのでよろしくお願いします。

8.Prism ListBox,ComboBoxのデータバインディング

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です