AsyncReactiveCommandを試してみる

2020/03/18

C# WPF

アイキャッチ

存在は知ってましたが他に優先順位の高い案件が多かったので後回しになってました。

結果から言えばもっと早くやるべきでしたね(汗

簡単に言えばボタンを押して処理が終わるまでボタンを押せないようにするのが楽にできます。

私のような装置系は特にボタンを押してから処理が終わるまでは時間がかかり、その間はボタンが押せないようにするのは当然のふるまいです。

(たまに手抜きでボタンが押せるようになっているアプリも見受けられますが...)

今まではReactiveCommandにSelectで条件を記述したりボタンのIsEnabledにboolをBindingしてましたが、AsyncReactiveCommandを使う事で余計な手間が省けます。

但し装置系でよくあるボタン構成で「リセット」と「スタート」のボタンがあり、装置立ち上げ直後は「リセット」だけ有効、リセット後は「スタート」だけ有効、動作中は「リセット」も「スタート」も無効といったパターンでは工夫が必要ですが、最低限そのボタンに該当する処理が行われている時はそのボタンの有効、無効は気にしなくてOKなのは手間が省けます。

View

<Button Content="Button1" Command="{Binding Button1Command}" />
<Button Content="Button2" Command="{Binding Button2Command}" />
<Button Content="Button3" Command="{Binding Button3Command}" />

今回のサンプルでは「Button1」は単独で処理中は押せなくなり、「Button2」と「Button3」はいずれかのボタンが押され処理中はどちらのボタンも押せなくしています。

そして処理の実行は非同期で行われ、処理中でも画面が固まる事はありません。

変数宣言

public AsyncReactiveCommand Button1Command { get; }
public AsyncReactiveCommand Button2Command { get; }
public AsyncReactiveCommand Button3Command { get; }
public ReactivePropertySlim<bool> IsButtonEnable = new ReactivePropertySlim<bool>(true);

ViewModelのコンストラクタ

Button1Command = new AsyncReactiveCommand().WithSubscribe(Button1Processing);
Button2Command = IsButtonEnable.ToAsyncReactiveCommand().WithSubscribe(Button2Processing);
Button3Command = IsButtonEnable.ToAsyncReactiveCommand().WithSubscribe(Button3Processing);

「Button1」が押されると「Button1」だけが押せなくなりButton1Processingメソッドが非同期で実行されます。

「Button2」が押されると「Button2」と「Button3」が押せなくなりButton2Processingメソッドが非同期実行されます。

「Button3」が押されると「Button2」と「Button3」が押せなくなりButton3Processingメソッドが非同期実行されます。

参考例をシンプルにするためDisposeの処理は省略していますが、詳しくはサンプルを参照お願いします。

自己紹介

自分の写真



新潟県のとある企業で働いてます。
【できる事】
電子回路設計
基板パターン設計
マイコンプログラム
C#(WinForms WPF)を使ったWindowsアプリケーション作成
PLCラダー
自動化装置アドバイザー
にほんブログ村 IT技術ブログ ソフトウェアへ

カテゴリ

このブログを検索

QooQ