dnackのブログ

コード書く仕事の間にコード書いてる知命目前のおっさんです。

Prism/XamarinでAndroidアプリの作成(9.5):バリデーションの別解

前回調べたバリデーションの方法は以下の通り。

dnack.hatenablog.com

これが今作っているコードで使えなかったので別解を調べた。

定義

        [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にしたりしていると使えない(?)ようなので、 その場合はこちらを使うといい。 (ドキュメント読むと対応してなくはないようなのだけど、 何かおかしいことしてるのかなぁ…)