検索すると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 10:26