Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。onlyから脱却して、マルチプラットフォーム戦略を打ち出しています。その戦略はデスクトップ向けのGUIアプリにもおよび、マルチプラットフォームで動作するアプリの開発ができるさまざまなライブラリやフレームワークが提供されるようになってきました。本連載では、Windows環境におけるマルチプラットフォームGUI技術(.NET以外も含む)について、(主にC#の)サンプルコードをまじえて解説します。2予測気温表示アプリ──JSON処理とAPIの呼び出し予測気温をWebAPIから取得する.NET標準のJSON処理.NET標準のHTTPクライアントを利用するLINQを用いて現在時刻以降を取得するクリック後の画面表示を追加する最後に参考文献はじめにWindows環境で開発可能なマルチプラットフォームGUI技術を解説してきた本連載も今回で最後になりました。最終回は前回の続きの予測気温表示アプリを解説し、アプリを完成させます。対象読者C#の基礎的な知識がある方を対象とします。C#の基本文法などの解説は割愛します。前回は、予測気温表示アプリのコンボボックス部分を解説しました。残りの処理を追加していきましょう。ビューへボタン要素を追加するまずはボタンを追加します。このボタンを押すことで、選択された県庁所在地の気温表示を行うようにします。ビューのMainWindow.axamlの<ComboBox>の下に、UI要素のボタン<Button>を追加します。OnClickCommand}">24時間先の気温</Button></StackPanel>MVVMパターンでは、ボタンを押すなどのイベント処理は、コマンドというものにバインディングする形になります。UIでは、WPF同様に、ボタンにコマンドをバインディングすることでイベント処理を行えます。<Button>のCommand属性に、ボタンを押した場合に呼び出される処理を記述します。ここでは、プロパティ名をOnClickCommandとしています。次にコマンドの実装なのですが、これがやや面倒です。WPF同様に、次のような流れになります。ICommandインターフェイスを実装したコマンドクラスを作成し、実行したい処理をExecuteメソッドに記述する。ビューモデルでコマンドクラスを生成し、そのインスタンスをプロパティで公開する。MVVMパターンのコマンド処理このように、ビューやビューモデルからコマンド処理を切り離すことで、単体でテストが行えるようになります。ボタンひとつのイベント処理でも、MVVMパターンではコード量が多くなりがちです。そのため、よりシンプルに記述できるオープンソースのMVVMパターン用のライブラリ(フレームワーク)が存在します。UIのテンプレートプロジェクトにも含まれています。ReactiveUIのReactiveCommandという、静的メソッドを定義したユーティリティクラスを使うと、コマンド処理がよりシンプルに記述できます。ビューモデルのMainWindowViewModelクラスに、次のようなコマンド処理を追加します。}}ボタンがクリックされると、OnClickメソッドが実行されることになります。次は、ボタンをクリックした後の処理で、テキストを表示するようにしてみましょう。テキスト表示をする<TextBlock>を、MainWindow.axamlに追加します。/></StackPanel>そして、バインディングしているResultプロパティを、MainWindowViewModelクラスに追加します。}}また、OnClickメソッドで、Resultプロパティを書き換えるようにします。これで、一度実行してみましょう。ボタン追加ボタンをクリックしたら、文字が表示されましたか?コントロールの書き換え通知じつは、先ほどの処理では、ボタンをクリックしてもテキストが表示されません。確かにプロパティ自体は更新されるのですが、ウィンドウの<TextBlock>は、更新されないのです。<TextBlock>を動的に更新するには、プロパティの更新時に、RaiseAndSetIfChangedメソッドを呼び出します。このメソッドにより、プロパティの内容が変更されている場合は、画面が更新されていることが通知され、画面の書き換え処理が実行されます。}ボタンをクリックすると、次のように表示されるはずです。今度は、選択された県庁所在地を表示してみましょう。MainWindowViewModelクラスのOnClickメソッドを次のように変更します。}}コンボボックスから県庁所在地を選択して、その後ボタンをクリックすると、選択された県庁所在地が表示されます。コンボボックスで選択した値は、Capitalpointプロパティを通じて参照できます。したがって、Capitalpoint.nameをResultプロパティに代入すると、画面に表示されるというわけです。