回答編集履歴

6

見直しキャンペーン中

2023/07/26 16:13

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -1,219 +1,110 @@
1
1
  最終的な結論は当該issueを確認してください。
2
-
3
2
  [2枚目以降のウィンドウでバリデーションエラー赤枠が残る · Issue #258 · runceel/ReactiveProperty](https://github.com/runceel/ReactiveProperty/issues/258)
4
3
 
5
-
6
-
7
4
  対応版がリリースされました。
8
-
9
5
  [ReactiveProperty 7.10.0 をリリースしました](https://zenn.dev/okazuki/articles/62a6c6c9d1a12baccc93#7.10.0)
10
-
11
6
  [Getting start for WPF | ReactiveProperty documentation](https://okazuki.jp/ReactiveProperty/getting-started/wpf.html)
12
7
 
13
-
14
-
15
8
  全部書き換えたい気分ですが^^; 経緯が分からなくなってしまうので残します。
16
-
17
9
  が、以下は見る必要はありません。
18
-
19
-
20
10
 
21
11
  ~~はっきり言って分かってませんが、~~
22
12
 
23
-
24
-
25
13
  ~~* `ReactivePropertyMode.IgnoreInitialValidationError`を入れる~~
26
-
27
14
  ~~* `Validation.ErrorTemplate`を設定する~~
28
-
29
-
30
15
 
31
16
  ~~どちらかをしたら消えました。~~
32
17
 
33
18
 
34
-
35
-
36
-
37
19
  ~~そういう仕様(という名のバグ?)な気がします(深堀する気はありません)~~
38
-
39
20
  ~~一番手間がかからなそうな回避策はこんなんでしょうか?(バカバカしいがw~~
40
21
 
41
-
42
-
43
- ```xaml
22
+ ```xml
44
-
45
23
  <Window.Resources>
46
-
47
24
  <Style BasedOn="{StaticResource {x:Type TextBox}}" TargetType="{x:Type TextBox}">
48
-
49
25
  <Style.Triggers>
50
-
51
26
  <Trigger Property="Validation.HasError" Value="False">
52
-
53
27
  <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
54
-
55
28
  </Trigger>
56
-
57
29
  </Style.Triggers>
58
-
59
30
  </Style>
60
-
61
31
  </Window.Resources>
62
-
63
32
  ```
64
-
65
-
66
33
 
67
34
  ~~どこかに言及があると思いますし回避策も同じようなものだと思いますが、これといったところを見つけられませんでした^^;~~
68
35
 
36
+ ---
69
37
 
38
+ 最小限のコードを作って検証したところ、ReactivePropertyが何かおかしいです。
39
+ 最初の`Window`は問題ないのですが、そこからさらに`Window`を開くと赤枠が残ります。
40
+
41
+ すべて最新版を使用、.NET48・.NET5とも同様。比較相手は↓です。
42
+ [NuGet Gallery | CommunityToolkit.Mvvm 7.0.1](https://www.nuget.org/packages/CommunityToolkit.Mvvm/)
43
+ [ObservableValidator - Windows Community Toolkit | Microsoft Docs](https://docs.microsoft.com/en-us/windows/communitytoolkit/mvvm/observablevalidator)
44
+
45
+ ```xml
46
+ <Window
47
+ x:Class="Questions334418.MainWindow"
48
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
49
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
50
+ xmlns:local="clr-namespace:Questions334418"
51
+ Width="800"
52
+ Height="450">
53
+ <Window.DataContext>
54
+ <local:ViewModel />
55
+ </Window.DataContext>
56
+ <StackPanel VerticalAlignment="Center">
57
+ <Button Click="Button_Click" Content="open" />
58
+ <TextBox Text="{Binding RP_Text.Value, UpdateSourceTrigger=PropertyChanged}" />
59
+ <TextBox Text="{Binding OV_Text, UpdateSourceTrigger=PropertyChanged}" />
60
+ </StackPanel>
61
+ </Window>
62
+ ```
63
+ ```cs
64
+ using CommunityToolkit.Mvvm.ComponentModel;
65
+ using Reactive.Bindings;
66
+ using System.ComponentModel.DataAnnotations;
67
+ using System.Windows;
68
+
69
+ namespace Questions334418
70
+ {
71
+ public partial class MainWindow : Window
72
+ {
73
+ public MainWindow()
74
+ {
75
+ InitializeComponent();
76
+
77
+ // xamlのWindow.DataContextが残っていると上書きしようがおかしなまま。
78
+ //DataContext = new ViewModel();
79
+
80
+ var vm = DataContext as ViewModel;
81
+ vm.RP_Text.Value = "a";
82
+ vm.OV_Text = "a";
83
+ }
84
+
85
+ private void Button_Click(object sender, RoutedEventArgs e) => new MainWindow().Show();
86
+ }
87
+
88
+ public class ViewModel : ObservableValidator
89
+ {
90
+ [Required(ErrorMessage = "値を入力してください。")]
91
+ //[StringLength(8, ErrorMessage = "8文字以内で入力してください。")]
92
+ public ReactiveProperty<string> RP_Text { get; }
93
+
94
+ [Required(ErrorMessage = "値を入力してください。")]
95
+ //[StringLength(8, ErrorMessage = "8文字以内で入力してください。")]
96
+ public string OV_Text { get => text; set => SetProperty(ref text, value, true); }
97
+ private string text;
98
+
99
+ public ViewModel() => RP_Text = new ReactiveProperty<string>().SetValidateAttribute(() => RP_Text);
100
+ }
101
+ }
102
+ ```
70
103
 
71
104
  ---
72
105
 
73
-
74
-
75
- 最小限のコードを作って検証したところ、`ReactiveProperty`が何かおかしいです。
76
-
77
- 最初の`Window`は問題ないのですが、そこからさらに`Window`を開くと赤枠が残ります。
78
-
79
-
80
-
81
- すべて最新版を使用、.NET48・.NET5とも同様。比較相手は↓です。
82
-
83
- [NuGet Gallery | CommunityToolkit.Mvvm 7.0.1](https://www.nuget.org/packages/CommunityToolkit.Mvvm/)
84
-
85
- [ObservableValidator - Windows Community Toolkit | Microsoft Docs](https://docs.microsoft.com/en-us/windows/communitytoolkit/mvvm/observablevalidator)
86
-
87
-
88
-
89
- ```xaml
90
-
91
- <Window
92
-
93
- x:Class="Questions334418.MainWindow"
94
-
95
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
96
-
97
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
98
-
99
- xmlns:local="clr-namespace:Questions334418"
100
-
101
- Width="800"
102
-
103
- Height="450">
104
-
105
- <Window.DataContext>
106
-
107
- <local:ViewModel />
108
-
109
- </Window.DataContext>
110
-
111
- <StackPanel VerticalAlignment="Center">
112
-
113
- <Button Click="Button_Click" Content="open" />
114
-
115
- <TextBox Text="{Binding RP_Text.Value, UpdateSourceTrigger=PropertyChanged}" />
116
-
117
- <TextBox Text="{Binding OV_Text, UpdateSourceTrigger=PropertyChanged}" />
118
-
119
- </StackPanel>
120
-
121
- </Window>
122
-
123
- ```
124
-
125
- ```C#
126
-
127
- using CommunityToolkit.Mvvm.ComponentModel;
128
-
129
- using Reactive.Bindings;
130
-
131
- using System.ComponentModel.DataAnnotations;
132
-
133
- using System.Windows;
134
-
135
-
136
-
137
- namespace Questions334418
138
-
139
- {
140
-
141
- public partial class MainWindow : Window
142
-
143
- {
144
-
145
- public MainWindow()
146
-
147
- {
148
-
149
- InitializeComponent();
150
-
151
-
152
-
153
- // xamlのWindow.DataContextが残っていると上書きしようがおかしなまま。
154
-
155
- //DataContext = new ViewModel();
156
-
157
-
158
-
159
- var vm = DataContext as ViewModel;
160
-
161
- vm.RP_Text.Value = "a";
162
-
163
- vm.OV_Text = "a";
164
-
165
- }
166
-
167
-
168
-
169
- private void Button_Click(object sender, RoutedEventArgs e) => new MainWindow().Show();
170
-
171
- }
172
-
173
-
174
-
175
- public class ViewModel : ObservableValidator
176
-
177
- {
178
-
179
- [Required(ErrorMessage = "値を入力してください。")]
180
-
181
- //[StringLength(8, ErrorMessage = "8文字以内で入力してください。")]
182
-
183
- public ReactiveProperty<string> RP_Text { get; }
184
-
185
-
186
-
187
- [Required(ErrorMessage = "値を入力してください。")]
188
-
189
- //[StringLength(8, ErrorMessage = "8文字以内で入力してください。")]
190
-
191
- public string OV_Text { get => text; set => SetProperty(ref text, value, true); }
192
-
193
- private string text;
194
-
195
-
196
-
197
- public ViewModel() => RP_Text = new ReactiveProperty<string>().SetValidateAttribute(() => RP_Text);
198
-
199
- }
200
-
201
- }
202
-
203
- ```
204
-
205
-
206
-
207
- ---
208
-
209
-
210
-
211
106
  ~~コードで`DataContext`を設定するという回避法はあんまりなので(DIできないし挙動が変わるというのも気持ちが悪い)、`ImmediateScheduler`を指定するのがいいのかもしれません。~~
212
-
213
107
  ~~それにより`DataContext`の設定方法によらず同じ挙動になりました。~~
214
108
 
215
-
216
-
217
109
  ~~ただしUIスレッドを複数作ってはいけない等の制限事項があります。~~
218
-
219
110
  ~~[UI スレッドへのイベントの自動ディスパッチ](https://qiita.com/okazuki/items/7572f46848d0e93516b1#ui-%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%B8%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E8%87%AA%E5%8B%95%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81-slim-%E3%81%AB%E3%81%AF%E7%84%A1%E3%81%84%E6%A9%9F%E8%83%BD)~~

5

対応版がリリースされました(ReactiveProperty 7.10.0)

2021/04/29 23:35

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -4,6 +4,14 @@
4
4
 
5
5
 
6
6
 
7
+ 対応版がリリースされました。
8
+
9
+ [ReactiveProperty 7.10.0 をリリースしました](https://zenn.dev/okazuki/articles/62a6c6c9d1a12baccc93#7.10.0)
10
+
11
+ [Getting start for WPF | ReactiveProperty documentation](https://okazuki.jp/ReactiveProperty/getting-started/wpf.html)
12
+
13
+
14
+
7
15
  全部書き換えたい気分ですが^^; 経緯が分からなくなってしまうので残します。
8
16
 
9
17
  が、以下は見る必要はありません。

4

全部書き換えたい気分

2021/04/29 23:35

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -1,3 +1,15 @@
1
+ 最終的な結論は当該issueを確認してください。
2
+
3
+ [2枚目以降のウィンドウでバリデーションエラー赤枠が残る · Issue #258 · runceel/ReactiveProperty](https://github.com/runceel/ReactiveProperty/issues/258)
4
+
5
+
6
+
7
+ 全部書き換えたい気分ですが^^; 経緯が分からなくなってしまうので残します。
8
+
9
+ が、以下は見る必要はありません。
10
+
11
+
12
+
1
13
  ~~はっきり言って分かってませんが、~~
2
14
 
3
15
 
@@ -188,12 +200,12 @@
188
200
 
189
201
 
190
202
 
191
- コードで`DataContext`を設定するという回避法はあんまりなので(DIできないし挙動が変わるというのも気持ちが悪い)、`ImmediateScheduler`を指定するのがいいのかもしれません。
192
-
193
- それにより`DataContext`の設定方法によらず同じ挙動になりました。
194
-
195
-
196
-
197
- ただしUIスレッドを複数作ってはいけない等の制限事項があります。
198
-
199
- [UI スレッドへのイベントの自動ディスパッチ](https://qiita.com/okazuki/items/7572f46848d0e93516b1#ui-%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%B8%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E8%87%AA%E5%8B%95%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81-slim-%E3%81%AB%E3%81%AF%E7%84%A1%E3%81%84%E6%A9%9F%E8%83%BD)
203
+ ~~コードで`DataContext`を設定するという回避法はあんまりなので(DIできないし挙動が変わるというのも気持ちが悪い)、`ImmediateScheduler`を指定するのがいいのかもしれません。~~
204
+
205
+ ~~それにより`DataContext`の設定方法によらず同じ挙動になりました。~~
206
+
207
+
208
+
209
+ ~~ただしUIスレッドを複数作ってはいけない等の制限事項があります。~~
210
+
211
+ ~~[UI スレッドへのイベントの自動ディスパッチ](https://qiita.com/okazuki/items/7572f46848d0e93516b1#ui-%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%B8%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E8%87%AA%E5%8B%95%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81-slim-%E3%81%AB%E3%81%AF%E7%84%A1%E3%81%84%E6%A9%9F%E8%83%BD)~~

3

ImmediateScheduler

2021/04/26 15:10

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -181,3 +181,19 @@
181
181
  }
182
182
 
183
183
  ```
184
+
185
+
186
+
187
+ ---
188
+
189
+
190
+
191
+ コードで`DataContext`を設定するという回避法はあんまりなので(DIできないし挙動が変わるというのも気持ちが悪い)、`ImmediateScheduler`を指定するのがいいのかもしれません。
192
+
193
+ それにより`DataContext`の設定方法によらず同じ挙動になりました。
194
+
195
+
196
+
197
+ ただしUIスレッドを複数作ってはいけない等の制限事項があります。
198
+
199
+ [UI スレッドへのイベントの自動ディスパッチ](https://qiita.com/okazuki/items/7572f46848d0e93516b1#ui-%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%81%B8%E3%81%AE%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E8%87%AA%E5%8B%95%E3%83%87%E3%82%A3%E3%82%B9%E3%83%91%E3%83%83%E3%83%81-slim-%E3%81%AB%E3%81%AF%E7%84%A1%E3%81%84%E6%A9%9F%E8%83%BD)

2

ReactivePropertyが何かおかしい

2021/04/26 09:34

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -14,9 +14,9 @@
14
14
 
15
15
 
16
16
 
17
- そういう仕様(という名のバグ?)な気がします(深堀する気はありません)
17
+ ~~そういう仕様(という名のバグ?)な気がします(深堀する気はありません)~~
18
18
 
19
- 一番手間がかからなそうな回避策はこんなんでしょうか?(バカバカしいがw
19
+ ~~一番手間がかからなそうな回避策はこんなんでしょうか?(バカバカしいがw~~
20
20
 
21
21
 
22
22
 
@@ -44,4 +44,140 @@
44
44
 
45
45
 
46
46
 
47
- どこかに言及があると思いますし回避策も同じようなものだと思いますが、これといったところを見つけられませんでした^^;
47
+ ~~どこかに言及があると思いますし回避策も同じようなものだと思いますが、これといったところを見つけられませんでした^^;~~
48
+
49
+
50
+
51
+ ---
52
+
53
+
54
+
55
+ 最小限のコードを作って検証したところ、`ReactiveProperty`が何かおかしいです。
56
+
57
+ 最初の`Window`は問題ないのですが、そこからさらに`Window`を開くと赤枠が残ります。
58
+
59
+
60
+
61
+ すべて最新版を使用、.NET48・.NET5とも同様。比較相手は↓です。
62
+
63
+ [NuGet Gallery | CommunityToolkit.Mvvm 7.0.1](https://www.nuget.org/packages/CommunityToolkit.Mvvm/)
64
+
65
+ [ObservableValidator - Windows Community Toolkit | Microsoft Docs](https://docs.microsoft.com/en-us/windows/communitytoolkit/mvvm/observablevalidator)
66
+
67
+
68
+
69
+ ```xaml
70
+
71
+ <Window
72
+
73
+ x:Class="Questions334418.MainWindow"
74
+
75
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
76
+
77
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
78
+
79
+ xmlns:local="clr-namespace:Questions334418"
80
+
81
+ Width="800"
82
+
83
+ Height="450">
84
+
85
+ <Window.DataContext>
86
+
87
+ <local:ViewModel />
88
+
89
+ </Window.DataContext>
90
+
91
+ <StackPanel VerticalAlignment="Center">
92
+
93
+ <Button Click="Button_Click" Content="open" />
94
+
95
+ <TextBox Text="{Binding RP_Text.Value, UpdateSourceTrigger=PropertyChanged}" />
96
+
97
+ <TextBox Text="{Binding OV_Text, UpdateSourceTrigger=PropertyChanged}" />
98
+
99
+ </StackPanel>
100
+
101
+ </Window>
102
+
103
+ ```
104
+
105
+ ```C#
106
+
107
+ using CommunityToolkit.Mvvm.ComponentModel;
108
+
109
+ using Reactive.Bindings;
110
+
111
+ using System.ComponentModel.DataAnnotations;
112
+
113
+ using System.Windows;
114
+
115
+
116
+
117
+ namespace Questions334418
118
+
119
+ {
120
+
121
+ public partial class MainWindow : Window
122
+
123
+ {
124
+
125
+ public MainWindow()
126
+
127
+ {
128
+
129
+ InitializeComponent();
130
+
131
+
132
+
133
+ // xamlのWindow.DataContextが残っていると上書きしようがおかしなまま。
134
+
135
+ //DataContext = new ViewModel();
136
+
137
+
138
+
139
+ var vm = DataContext as ViewModel;
140
+
141
+ vm.RP_Text.Value = "a";
142
+
143
+ vm.OV_Text = "a";
144
+
145
+ }
146
+
147
+
148
+
149
+ private void Button_Click(object sender, RoutedEventArgs e) => new MainWindow().Show();
150
+
151
+ }
152
+
153
+
154
+
155
+ public class ViewModel : ObservableValidator
156
+
157
+ {
158
+
159
+ [Required(ErrorMessage = "値を入力してください。")]
160
+
161
+ //[StringLength(8, ErrorMessage = "8文字以内で入力してください。")]
162
+
163
+ public ReactiveProperty<string> RP_Text { get; }
164
+
165
+
166
+
167
+ [Required(ErrorMessage = "値を入力してください。")]
168
+
169
+ //[StringLength(8, ErrorMessage = "8文字以内で入力してください。")]
170
+
171
+ public string OV_Text { get => text; set => SetProperty(ref text, value, true); }
172
+
173
+ private string text;
174
+
175
+
176
+
177
+ public ViewModel() => RP_Text = new ReactiveProperty<string>().SetValidateAttribute(() => RP_Text);
178
+
179
+ }
180
+
181
+ }
182
+
183
+ ```

1

回避策

2021/04/23 04:35

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -1,11 +1,47 @@
1
- はっきり言って分かってませんが、
1
+ ~~はっきり言って分かってませんが、~~
2
2
 
3
3
 
4
4
 
5
- * `ReactivePropertyMode.IgnoreInitialValidationError`を入れる
5
+ ~~* `ReactivePropertyMode.IgnoreInitialValidationError`を入れる~~
6
6
 
7
- * `Validation.ErrorTemplate`を設定する
7
+ ~~* `Validation.ErrorTemplate`を設定する~~
8
8
 
9
9
 
10
10
 
11
- どちらかをしたら消えました。
11
+ ~~どちらかをしたら消えました。~~
12
+
13
+
14
+
15
+
16
+
17
+ そういう仕様(という名のバグ?)な気がします(深堀する気はありません)
18
+
19
+ 一番手間がかからなそうな回避策はこんなんでしょうか?(バカバカしいがw
20
+
21
+
22
+
23
+ ```xaml
24
+
25
+ <Window.Resources>
26
+
27
+ <Style BasedOn="{StaticResource {x:Type TextBox}}" TargetType="{x:Type TextBox}">
28
+
29
+ <Style.Triggers>
30
+
31
+ <Trigger Property="Validation.HasError" Value="False">
32
+
33
+ <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
34
+
35
+ </Trigger>
36
+
37
+ </Style.Triggers>
38
+
39
+ </Style>
40
+
41
+ </Window.Resources>
42
+
43
+ ```
44
+
45
+
46
+
47
+ どこかに言及があると思いますし回避策も同じようなものだと思いますが、これといったところを見つけられませんでした^^;