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

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

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

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

WPF

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

Q&A

解決済

1回答

2646閲覧

ReactivePropertyで複数のObserveHasErrorsからbool値を設定したい。

axl8888888

総合スコア1

C#

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

WPF

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

1グッド

0クリップ

投稿2021/09/02 02:43

前提・実現したいこと

お世話になっておりますWPF初心者です。
初歩的な質問となりますが、
複数のReactivePropertyのObservehasErrorsを、1つでもTrueであればTrueそれ以外はFalseという条件でbool型変数に設定したいと考えています。

発生している問題・エラーメッセージ

Subscribeしてbool型のクラス変数へ設定するか
ToReadOnlyReactiveProperty()でReadOnlyReactiveProperty<bool>型変数へ設定する方法を検討しています。

後学のため双方の方法をご教示いただければ幸いです。

該当のソースコード

C#

1IObservable<bool>[] errors = new[] { 2 A.ObserveHasErrors 3 B.ObserveHasErrors 4};

試したこと

補足情報(FW/ツールのバージョンなど)

Prism.Unity 8.0.0.1909
Reactiveproperty 7.11.0

TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

検索するとReactiveCommandにする例が多いですが、ToReactiveCommandするかToReactivePropertyするか程度の違いです。
コマンドの場合はエラーがないときに実行したいですから、判定は逆になることが多いですね。

cs

1using Reactive.Bindings; 2using System; 3using System.ComponentModel.DataAnnotations; 4using System.Linq; 5using System.Reactive.Linq; 6 7namespace Questions357340 8{ 9 class ViewModel 10 { 11 [Required] public ReactiveProperty<string> A { get; } 12 [Range(1, 10)] public ReactiveProperty<int> B { get; } 13 public ReadOnlyReactiveProperty<bool> AnyErrors { get; } 14 public bool AnyErrorsField; 15 16 public ViewModel() 17 { 18 A = new ReactiveProperty<string>().SetValidateAttribute(() => A); 19 B = new ReactiveProperty<int>().SetValidateAttribute(() => B); 20 IObservable<bool>[] errors = { A.ObserveHasErrors, B.ObserveHasErrors, }; 21 22 AnyErrors = errors.CombineLatest(x => x.Any(y => y)).ToReadOnlyReactiveProperty(); 23 //AnyErrors = errors.CombineLatestValuesAreAllFalse().Inverse().ToReadOnlyReactiveProperty(); 24 25 errors.CombineLatest(x => x.Any(y => y)).Subscribe(x => AnyErrorsField = x); // 後始末省略 26 AnyErrorsField = AnyErrors.Value; // 初期値は知りようがないのでセット 27 } 28 } 29 30 class Program 31 { 32 static void Main() 33 { 34 var vm = new ViewModel(); 35 Console.WriteLine($"A.HasErrors:{vm.A.HasErrors}, B.HasErrors:{vm.B.HasErrors}, AnyErrors:{vm.AnyErrors.Value}, AnyErrorsField:{vm.AnyErrorsField}"); 36 37 vm.A.Value = "hoge"; 38 Console.WriteLine($"A.HasErrors:{vm.A.HasErrors}, B.HasErrors:{vm.B.HasErrors}, AnyErrors:{vm.AnyErrors.Value}, AnyErrorsField:{vm.AnyErrorsField}"); 39 40 vm.B.Value = 1; 41 Console.WriteLine($"A.HasErrors:{vm.A.HasErrors}, B.HasErrors:{vm.B.HasErrors}, AnyErrors:{vm.AnyErrors.Value}, AnyErrorsField:{vm.AnyErrorsField}"); 42 } 43 } 44}
A.HasErrors:True, B.HasErrors:True, AnyErrors:True, AnyErrorsField:True A.HasErrors:False, B.HasErrors:True, AnyErrors:True, AnyErrorsField:True A.HasErrors:False, B.HasErrors:False, AnyErrors:False, AnyErrorsField:False

投稿2021/09/02 08:41

編集2023/07/29 04:14
TN8001

総合スコア9862

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

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

axl8888888

2021/09/02 10:26

ご回答ありがとうございました。目的を達成する事ができました。 errorsからCombineLatestを行わずにAnyを行っていたことが原因で、Subscribeで発生するビルドエラーが解決できておりませんでした。その他いろいろ模索していたため「試したこと」が記載できておりませんでした。 おかげさまで、CombineLatestで行われる合成の意味が理解できました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問