質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2581閲覧

[MVVM] ReactiveCommandにて実行条件を複数持ちたい

kuniyan

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2018/11/08 01:51

編集2018/11/08 01:54

C#そのものが初心者で、至らぬ点があるかと思いますがよろしくお願いいたします。

MVVMでGUI開発を行っております。
以下の条件の時のみ、ボタンを活性化するCommandを作成したいです。

  1. ReactiveProperty A,B,Cが何かしら入力されている
  2. ReactiveProperty A,Bは数字のみ

1.のコードは以下のように簡単に書けました。

C#

1 class MainViewModel : INotifyPropertyChanged 2 { 3 public ReactiveProperty<string> A { get; } = new ReactiveProperty<string>(string.Empty); 4 public ReactiveProperty<string> B { get; } = new ReactiveProperty<string>(string.Empty); 5 public ReactiveProperty<string> C { get; } = new ReactiveProperty<string>(string.Empty); 6 public AsyncReactiveCommand SendCommand { get; } 7 8 public MainViewModel() 9 { 10 SendCommand = new[] { A,B,C } 11 .CombineLatest(x => x.All(y => !string.IsNullOrEmpty(y))).ToAsyncReactiveCommand(); 12 SendCommand.Subscribe(async _ => { 13 ... 14 }); 15 }

プロパティAで数値以外が入っていたら以下のようにエラーを出すようにし、

C#

1 [RegularExpression("[0-9]+", ErrorMessage = "Num only")] 2 public ReactiveProperty<string> A { get; } = new ReactiveProperty<string>(string.Empty); 3 4 [RegularExpression("[0-9]+", ErrorMessage = "Num only")] 5 public ReactiveProperty<string> B { get; } = new ReactiveProperty<string>(string.Empty);

エラーがなかったら、処理するCommandを追加したいです。

C#

1 A.SetValidateAttribute(() => A); 2 B.SetValidateAttribute(() => B); 3 4 SendCommand = new[] { A.ObserveHasErrors, B.ObserveHasErrors } 5 .CombineLatest(x => x.All(y => !y)).ToAsyncReactiveCommand();

上手いこと、二つの条件をつなぎ合わせることはできないでしょうか。

完全に理解できていないので、上手いこと書けませんが何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikupedia

2018/11/08 02:06

プロパティA,B,CのEmpty(またはNULL)のときはA,Bのように検証エラーにしますか?
kuniyan

2018/11/08 02:45 編集

ご対応ありがとうございます。 Property A,B,Cの値がEmptyの際もエラーを出せるようしたいです! よろしくお願いします!
guest

回答1

0

ベストアンサー

こんにちは!

プロパティA,B,CにRequired属性を追加してください。
引数のAllowEmptyStringsの値によって空白をエラーとするかどうか制御できます。
あとはSendCommandのObservableの配列にC.ObserveHasErrorsを追加すればOKです。

C#

1[Required(AllowEmptyStrings=True)] 2[RegularExpression("[0-9]+", ErrorMessage = "Num only")] 3public ReactiveProperty<string> A { get; } = new ReactiveProperty<string>(string.Empty); 4 5[Required(AllowEmptyStrings=True)] 6[RegularExpression("[0-9]+", ErrorMessage = "Num only")] 7public ReactiveProperty<string> B { get; } = new ReactiveProperty<string>(string.Empty); 8 9[Required(AllowEmptyStrings=True)] 10public ReactiveProperty<string> C { get; } = new ReactiveProperty<string>(string.Empty);

C#

1A.SetValidateAttribute(() => A); 2B.SetValidateAttribute(() => B); 3C.SetValidateAttribute(() => C); 4 5SendCommand = new[] { A.ObserveHasErrors, B.ObserveHasErrors, C.ObserveHasErrors }.CombineLatest(x => x.All(y => !y)).ToAsyncReactiveCommand();

投稿2018/11/08 04:08

mikupedia

総合スコア159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問