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

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

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

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

WPF

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

Q&A

解決済

1回答

2829閲覧

ReactivePropertyのSetValidateNotifyErrorの条件設定について

TomeSq

総合スコア10

C#

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

WPF

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

0グッド

0クリップ

投稿2018/10/16 06:50

以下の環境で開発しています。

●環境
ReactiveProperty 4.2.2
Prism.Unity 6.3.0

■質問
認証チェックボックスがOFFのときはユーザーテキストボックスのチェックを行わないようにしたい。
ReactivePropertyのSetValidateNotifyError内で他のIsAuthプロパティを見ているのですが、IsAuthが更新される前に処理が走ってしまい、条件に引っかかりません。
他のプロパティを更新した後にSetValidateNotifyErrorを呼び出す方法はありますか。

c#

1 public ReactiveProperty<bool> IsAuth { get; set; } = new ReactiveProperty<bool>(false); 2 public ReactiveProperty<string> User { get; set; } 3 public ReactiveProperty<IEnumerable<string>> ErrorMessages { get; private set; } 4 5 public MainWindowViewModel() 6 { 7 this.User = new ReactiveProperty<string>("") 8 .SetValidateNotifyError(x => 9 { 10 if(this.IsAuth.Value) 11 { 12 if(x.Length <= 0) 13 { 14 return "ユーザー名を入力してください。"; 15 } 16 } 17 return null; 18 }); 19 20 this.ErrorMessages = new[] 21 { 22 this.User.ObserveErrorChanged, 23 } 24 .CombineLatest(x => 25 { 26 return x.Where(y => y != null) 27 .SelectMany(y => y.OfType<string>()); 28 }) 29 .ToReactiveProperty(); 30 }

xml

1 <CheckBox x:Name="use_auth" Content="認証" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" VerticalAlignment="Center" Margin="10" 2 IsChecked="{Binding IsAuth.Value, Mode=TwoWay}"/> 3 4 <Label Content="ユーザー:" Grid.Column="0" Grid.Row="1" Margin="20,5,5,5" /> 5 <TextBox x:Name="user" Grid.Column="1" Grid.Row="1" Margin="10" 6 Text="{Binding User.Value, Mode=TwoWay}" 7 IsEnabled="{Binding IsAuth.Value, Mode=OneWay}"/> 8 9 <ItemsControl Grid.Column="0" Grid.Row="2" Grid.ColumnSpan="2" ItemsSource="{Binding ErrorMessages.Value}" Margin="10" Focusable="False"/>

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

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

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

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

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

guest

回答1

0

ベストアンサー

この一行を入れてください。

C#

1IsAuth.AsObservable().Subscribe(_ => User.ForceValidate());

投稿2018/10/16 07:20

Zuishin

総合スコア28660

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

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

Zuishin

2018/10/16 07:34

なお現在はテキストが変更された場合、フォーカスがテキストボックスから離れた時点で認証されますが UpdateSourceTrigger=PropertyChanged を設定するとテキストが更新されるたびに認証されます。
TomeSq

2018/10/16 23:30

ご回答ありがとうとうございました。 提示していただいた処理は、IsAuthの値が更新されたときにUserのvalidation処理を強制的に呼び出すといい意味と捉えて良いですか?
Zuishin

2018/10/16 23:38

その通りです。エラーの条件に IsAuth が有るにも関わらず、その変化に応じるようになっていなかったので IsAuth を変化させてもバリデーションが行われず無反応でした。 User プロパティを作るにあたって IsAuth を見るように組むこともできると思いますが、効果が同じなのにプログラムはこれより複雑になると思います。
TomeSq

2018/10/17 02:19

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問