質問: お世話になります。現在ReactivePropertyを勉強中です。 WPF + ReactivePropertyで値の検証を行いたいのですが実現方法がわからず困っています。 ■実現したいこと 以下のような入力フィールドとチェックボタンがあり、それぞれで検証を行いたい。 ``` ``` 1.入力フィールド値の検証 2.ボタン押下時に全体検証 エラーがあった場合は入力フィールドにエラーを表示したい。 ※1と2は別の検証内容となります。 この内2が問題で以下のようなコードからどうやってIDプロパティへエラーを通知していいかわからないのです。 ``` CheckCommand.Subscribe(() => { //例えばint値かどうかをチェックしたいとする int value; if (!int.TryParse(ID.Value, out value)) { //これをIDプロパティのエラーとして通知したい "数値ではありません"; } }); ``` ボタン押下時の検証は1の入力時と検証内容が違うため、プロパティ側の検証に入れられません。 以上、よろしくおねがいします。
回答: WPFでの入力値検証 検証の方法が色々載っています。 個々の値が検証されれば全体検証は必要ないんじゃないかと思いますが、例えばすべての入力について問題ない時だけボタンの Enabled が true になるようにすればいいのではないでしょうか。 追記 == そういえば ReactiveProperty でしたね。 ではこういうのはどうでしょう? 次の AddIntegers を ViewModel とし、First, Second, Answer をそれぞれテキストボックスにバインドします。 最初 CorrectAnswer.Value は null なので、エラーは起きません。 ボタンをクリックすることで CorrectAnswer.Value を First.Value + Second.Value に設定します。 そうした場合、入力が間違っていれば Answer が間違っていることになり、赤枠が付きます。 ``` public class AddIntegers { public AddIntegers() { Answer = new ReactiveProperty(0) .SetValidateNotifyError(a => a == CorrectAnswer.Value || CorrectAnswer.Value == null ? null : "間違っています"); } public ReactiveProperty First { get; } = new ReactiveProperty(); public ReactiveProperty Second { get; } = new ReactiveProperty(); public ReactiveProperty Answer { get; private set; } protected ReactiveProperty CorrectAnswer { get; } = new ReactiveProperty(); ``` この場合は「入力」と「あるべき値」と比較して検証していますが、あるべき値が決まっていなくても同様に true/false で条件付けられるものなら何でも使えます。 つまり、入力の一つ一つに対して、それが正しいか間違っているかを表すプロパティを作るということです。 プロパティの数は増えますが、計算の負荷が高い以上致し方ないものと思います。 キャッシュと考えてください。