teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

見直しキャンペーン中

2023/07/29 04:14

投稿

TN8001
TN8001

スコア10111

answer CHANGED
@@ -1,56 +1,56 @@
1
- 検索すると`ReactiveCommand`にする例が多いですが、`ToReactiveCommand`するか`ToReactiveProperty`するか程度の違いです。
2
- コマンドの場合はエラーがないときに実行したいですから、判定は逆になることが多いですね。
3
-
4
-
5
- ```C#
6
- using Reactive.Bindings;
7
- using System;
8
- using System.ComponentModel.DataAnnotations;
9
- using System.Linq;
10
- using System.Reactive.Linq;
11
-
12
- namespace Questions357340
13
- {
14
- class ViewModel
15
- {
16
- [Required] public ReactiveProperty<string> A { get; }
17
- [Range(1, 10)] public ReactiveProperty<int> B { get; }
18
- public ReadOnlyReactiveProperty<bool> AnyErrors { get; }
19
- public bool AnyErrorsField;
20
-
21
- public ViewModel()
22
- {
23
- A = new ReactiveProperty<string>().SetValidateAttribute(() => A);
24
- B = new ReactiveProperty<int>().SetValidateAttribute(() => B);
25
- IObservable<bool>[] errors = { A.ObserveHasErrors, B.ObserveHasErrors, };
26
-
27
- AnyErrors = errors.CombineLatest(x => x.Any(y => y)).ToReadOnlyReactiveProperty();
28
- //AnyErrors = errors.CombineLatestValuesAreAllFalse().Inverse().ToReadOnlyReactiveProperty();
29
-
30
- errors.CombineLatest(x => x.Any(y => y)).Subscribe(x => AnyErrorsField = x); // 後始末省略
31
- AnyErrorsField = AnyErrors.Value; // 初期値は知りようがないのでセット
32
- }
33
- }
34
-
35
- class Program
36
- {
37
- static void Main()
38
- {
39
- var vm = new ViewModel();
40
- Console.WriteLine($"A.HasErrors:{vm.A.HasErrors}, B.HasErrors:{vm.B.HasErrors}, AnyErrors:{vm.AnyErrors.Value}, AnyErrorsField:{vm.AnyErrorsField}");
41
-
42
- vm.A.Value = "hoge";
43
- Console.WriteLine($"A.HasErrors:{vm.A.HasErrors}, B.HasErrors:{vm.B.HasErrors}, AnyErrors:{vm.AnyErrors.Value}, AnyErrorsField:{vm.AnyErrorsField}");
44
-
45
- vm.B.Value = 1;
46
- Console.WriteLine($"A.HasErrors:{vm.A.HasErrors}, B.HasErrors:{vm.B.HasErrors}, AnyErrors:{vm.AnyErrors.Value}, AnyErrorsField:{vm.AnyErrorsField}");
47
- }
48
- }
49
- }
50
- ```
51
-
52
- ```
53
- A.HasErrors:True, B.HasErrors:True, AnyErrors:True, AnyErrorsField:True
54
- A.HasErrors:False, B.HasErrors:True, AnyErrors:True, AnyErrorsField:True
55
- A.HasErrors:False, B.HasErrors:False, AnyErrors:False, AnyErrorsField:False
1
+ 検索すると`ReactiveCommand`にする例が多いですが、`ToReactiveCommand`するか`ToReactiveProperty`するか程度の違いです。
2
+ コマンドの場合はエラーがないときに実行したいですから、判定は逆になることが多いですね。
3
+
4
+
5
+ ```cs
6
+ using Reactive.Bindings;
7
+ using System;
8
+ using System.ComponentModel.DataAnnotations;
9
+ using System.Linq;
10
+ using System.Reactive.Linq;
11
+
12
+ namespace Questions357340
13
+ {
14
+ class ViewModel
15
+ {
16
+ [Required] public ReactiveProperty<string> A { get; }
17
+ [Range(1, 10)] public ReactiveProperty<int> B { get; }
18
+ public ReadOnlyReactiveProperty<bool> AnyErrors { get; }
19
+ public bool AnyErrorsField;
20
+
21
+ public ViewModel()
22
+ {
23
+ A = new ReactiveProperty<string>().SetValidateAttribute(() => A);
24
+ B = new ReactiveProperty<int>().SetValidateAttribute(() => B);
25
+ IObservable<bool>[] errors = { A.ObserveHasErrors, B.ObserveHasErrors, };
26
+
27
+ AnyErrors = errors.CombineLatest(x => x.Any(y => y)).ToReadOnlyReactiveProperty();
28
+ //AnyErrors = errors.CombineLatestValuesAreAllFalse().Inverse().ToReadOnlyReactiveProperty();
29
+
30
+ errors.CombineLatest(x => x.Any(y => y)).Subscribe(x => AnyErrorsField = x); // 後始末省略
31
+ AnyErrorsField = AnyErrors.Value; // 初期値は知りようがないのでセット
32
+ }
33
+ }
34
+
35
+ class Program
36
+ {
37
+ static void Main()
38
+ {
39
+ var vm = new ViewModel();
40
+ Console.WriteLine($"A.HasErrors:{vm.A.HasErrors}, B.HasErrors:{vm.B.HasErrors}, AnyErrors:{vm.AnyErrors.Value}, AnyErrorsField:{vm.AnyErrorsField}");
41
+
42
+ vm.A.Value = "hoge";
43
+ Console.WriteLine($"A.HasErrors:{vm.A.HasErrors}, B.HasErrors:{vm.B.HasErrors}, AnyErrors:{vm.AnyErrors.Value}, AnyErrorsField:{vm.AnyErrorsField}");
44
+
45
+ vm.B.Value = 1;
46
+ Console.WriteLine($"A.HasErrors:{vm.A.HasErrors}, B.HasErrors:{vm.B.HasErrors}, AnyErrors:{vm.AnyErrors.Value}, AnyErrorsField:{vm.AnyErrorsField}");
47
+ }
48
+ }
49
+ }
50
+ ```
51
+
52
+ ```
53
+ A.HasErrors:True, B.HasErrors:True, AnyErrors:True, AnyErrorsField:True
54
+ A.HasErrors:False, B.HasErrors:True, AnyErrors:True, AnyErrorsField:True
55
+ A.HasErrors:False, B.HasErrors:False, AnyErrors:False, AnyErrorsField:False
56
56
  ```