この記事は2019年11月に書きましたが、自分的にはあまり使用頻度が高くなさそうだったので相当手抜きでサンプルソースの紹介だけでした。
しかしアクセス回数が多く、せっかく来て頂いたのに手抜き記事では申し訳ありませんでの2021年10月にきちんと書き直してみました。
尚、この記事を書いた当時のPrismはバージョン7でしたが現在はバージジョン8であり、もしかしたら機能がアップしているかもしれませんので分かったら随時追記したいと思います。
- もくじ
サンプルは
App.xaml.cs
デフォルトで存在しているRegisterTypesメソッドにRegisterDialogメソッドを使ってダイアログを追加します。
今回表示するViewは「Dialog.xaml」としViewModelは「DialogViewModel.cs」としてPrism UserControl(WPF)を追加しました。
ダイアログを登録するRegisterDialogメソッドは上記コードのように登録時にViewとViewModelを記述する手法とViewのみ記述する手法の2つの手段があります。
今回のケースではViewのみで問題なく実行できます。
MainWindowViewModel.csのコンストラクタ
宣言している変数は
各変数の説明は
ShowDialgo:MainWindow.xamlにあるボタンのCommandにバインディングする変数
DialogValue1:ダイアログの戻り値で名称がkey1の値を入れMainWindow.xamlに表示する情報
DialogValue2:ダイアログの戻り値で名称がkey2の値を入れMainWindow.xamlに表示する情報
dlgService:コンストラクタの引数IDialogServiceで取得したIDialogService型の情報
コンストラクタの中身は以下となります。
4行目でコンストラクタ引数で得たdialogServiceを別メソッドでも使えるようprivate readonlyな変数に入れています。
6行目からはボタンの押された処理になります。
8行目で実際にダイアログを表示するshowDialogメソッドを実行していますが、別メソッドではなくベタに書いてもかまいませんが今回は分けて説明するためにメソッドとしています。
10行目でダイアログが返したResultがButtonResultのどれなのかを見て処理を変えてます。
ダイアログから返ってきたIDialogParametersはIDialogResultのParameters.GetValueメソッドで取得できますが、取得するキー名が間違っているとnullが返ってくるので注意が必要です。
またダイアログからのDialogResultはButtonResultを返さない事もできますのでこれも間違えないようにしなくてはいけません。
MainWindowViewModelからダイアログを表示する
サンプルコードの自作メソットshowDialogが実際のダイアログを表示する部分になります。
ダイアログにわたすパラメータはIDialogParametersに文字列のキー名とobject型の値をセットとします。
2種類の手法を書きましたが個人的には「その2」の方が可読性が良く変更も容易に感じました。
11行目がダイアログを表示させるShowDialogメソッドですが、ここでコンストラクタで取得したIDialogServiceを利用しています。
DialogViewModel.csで必ず必要なもの
これがダイアログのViewModelになります。
注意点としてはIDialogAwareを継承しているので幾つかデフォルトで記述する必要があります。
1行目はダイアログに表示される名称です。
変数名は変えないようにしてください。
2行目はダイアログのCloseを要求するActionです。
これも何も変えずに使用します。
3行目からのメソッドはダイアログが閉じれるか判断し閉じれればtrue、まだ閉じれなければfalseを返すプログラムを書いてください。
メソッド名は不変です。
7行目のメソッドはダイアログが閉じられる時に実行されるメソッドです。
サンプルではこのタイミングでメインウインドウに返す値を文字列の「キー名」とobject型の値のペアでAddしていますが、これ以前に返す値をAddしてもOKです。
メソッド名は不変なので注意してください。
何か順番が違いますが定義されている順に説明すると最後に説明するOnDialogOpenedが起動した時に実行されるメソッドです。
15行目からになりますが、これもメソッド名は不変です。
引数IDialogParametersのGetValue<取得する型>("キー名")でメインウインドウから来た値を取得します。
DialogViewModel.csのコンストラクタ
ここではダイアログでボタンが押された処理を明記しています。
「はい」ボタンが押された時のCommandがReactiveCommandのYesCommandになり「いいえ」ボタンが押された時ぼCommandはCommandがReactiveCommandのNoCommandになります。
それぞれのボタンが押された時RequestCloseの引数IDialogResultの内容を変えならが RequestCloseが実行されます。
「はい」ボタンが押された時はButtonResult.Yesと返す値、「いいえ」が押された時はButtonResult.Noだけを返します。
また何も情報を返す必要がない場合は戻り値なしでのDialogResultを返してもOKです。
追記
自分で記事書いておきながらハマったので追記です。
追加するダイアログはソリューションエクスプローラーで「追加」-「新しい項目」の「Prism」-「WPF」にあるPrism UserControl(WPF)です。
Prism Window(WPF)ではないので注意してください。
0 件のコメント:
コメントを投稿