Prism/XamarinでAndroidアプリの作成(9.5):バリデーションの別解
前回調べたバリデーションの方法は以下の通り。
これが今作っているコードで使えなかったので別解を調べた。
定義
[Required(ErrorMessage = "ユーザ名を入力してください")] [RegularExpression(@"[a-zA-Z0-9]+", ErrorMessage = "半角英数字のみ入力できます")] public ReactiveProperty<string> Username { get; }
初期化
Username = new ReactiveProperty<string>() .SetValidateAttribute(() => Username) .AddTo(Disposable);
エラーの取り出し
UsernameErrorMessage = Username.ObserveErrorChanged
.Select(x => x?.Cast<string>().FirstOrDefault())
.ToReadOnlyReactiveProperty()
.AddTo(Disposable);
これを、VaritdationAttributeを使わないで、以下のように書ける。
定義
public ReactiveProperty<string> Username { get; }
初期化
Username = new ReactiveProperty<string>() .SetValidateNotifyError(s => string.IsNullOrEmpty(s) ? "ユーザ名を入力してください" : Regex.IsMatch(s, @"[a-zA-Z0-9]+") ? null : "半角英字のみ入力できます") .AddTo(Disposable);
エラーメッセージの入り方は同じなので、エラーメッセージの取り出しやボタンのディセーブルは 前回のサンプルコードのままでOK。
Prism(Xamarin.Form)の共通部分を.NetStandardライブラリで実装すると 前回調べたVaridationAttributeを使って書けるが、 共通部分をshared projectにしたりしていると使えない(?)ようなので、 その場合はこちらを使うといい。 (ドキュメント読むと対応してなくはないようなのだけど、 何かおかしいことしてるのかなぁ…)