PrismでXamarin.Formsする方法

C#Xamarin.FormsでPrismでMVVM実装#10_引数のある画面遷移

前回は画面遷移の時に指定するViewの名前を文字列で指定すると,バグの混入確立がUPするということで,nameofを使って対処するやり方を確認しました。今回は画面遷移の時に,引数が必要な場合の書き方を確認していきたいと思います。

引数を渡す側

引数を渡す側は,NavigationService.NavigateAsyncを記述するときに,NavigationParametersを渡す必要があります。NavigationParametersはstringのKeyとobject型の任意の値をセットにして渡します。今回はtitleというKeyで「XXXX」という文字列と引数として渡してみようと思います。

NavigationParametersのインスタンス「param」を生成して,titleというKeyとXXXX等文字のValueをセットにしたパラメータを作成して,NavigateAsyncの第2引数に渡しています。

引数をもらう側

引数をもらう側のPageBViewを見ていきましょう。

まず,PageBViewModelは現在BindableBaseを継承していますが,MainPageViewModelと同じようにViewModelBaseを継承したほうが便利なので,変更します。

ViewModelBaseに変更するとコンストラクタにINavigationServiceを指定していないためコンパイルエラーになります。これはMainPageViewModelを参考にしてコンストラクタの引数にINavigationServiceを記述します。Usingが不足しているとコンパイルが通らないため,「using Prism.Navigation;」を追加します。

OnNavigationToをコピー

PageBViewModelはViewModelBaseを継承するように変更しました。ViewModelBaseのソースコードを確認すると,OnNavigatedFrom,OnNavigatedTo,OnNavigatingToというvirtualメソッドが存在しています。語尾がToになっている2つは画面が表示される前と後に動作するメソッドです。今回は画面遷移前にパラメータを受け取りたいのでOnNavigatingToが動作するときにパラメータを受け取ります。OnNavigatingToのメソッドをコピーしてPageBViewModelに貼り付けます。

OnNavigatingToはViewModelBaseのvirtualメソッドなので,継承先のクラスで上書きをする必要があるためPageBViewModel側ではoverrideを記述しておきます。これで画面遷移時にparametersに引数がわたってくるので,MainPageViewModelで指定したKeyで引数を受け取ります。MainPageViewModelは「title」というKeyで指定したのでparameters[“title”]を指定すれば値が取得できます。この値をViewModelのTitleプロパティにセットして,画面のタイトルにしています。

View側の設定:タイトルのバインディング

PageBview側で,Titleのバインディングが必要なので次のように記述します。

これで,PageBViewModelで指定したTitleが画面に表示されるはずです。ここで一度実行してみましょう。

画面が表示されました。この状態で「NEXT PAGE」ボタンを押下します。

PageBが表示され,タイトルが「XXXX」になっていることが確認できました。

これでパラメータ渡しが成功していることが分かります。

Xamarin.FormsでPrismを使ってMVVMで実装する方法