回答編集履歴

1

見直しキャンペーン中

2023/07/29 14:03

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -1,249 +1,125 @@
1
1
  理由はさっぱりわかりませんが、`SampleInfos`を**更新する前**に`SelectedInfo`を`null`にしておくと動作するようになりました。
2
2
 
3
-
4
-
5
3
  確認した簡略コード
6
-
7
- ```xaml
4
+ ```xml
8
-
9
5
  <Window
10
-
11
6
  x:Class="Questions377285.MainWindow"
12
-
13
7
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
14
-
15
8
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
16
-
17
9
  xmlns:local="clr-namespace:Questions377285"
18
-
19
10
  Width="800"
20
-
21
11
  Height="450">
22
-
23
12
  <Window.DataContext>
24
-
25
13
  <local:ContentGridViewModel />
26
-
27
14
  </Window.DataContext>
28
-
29
15
  <Grid>
30
-
31
16
  <Grid.RowDefinitions>
32
-
33
17
  <RowDefinition Height="Auto" />
34
-
35
18
  <RowDefinition Height="Auto" />
36
-
37
19
  <RowDefinition />
38
-
39
20
  </Grid.RowDefinitions>
40
-
41
21
  <Button Command="{Binding Command}" Content="UIスレッド Update" />
42
-
43
22
  <ComboBox
44
-
45
23
  Grid.Row="1"
46
-
47
24
  DisplayMemberPath="TestNumber"
48
-
49
25
  ItemsSource="{Binding SampleInfos}"
50
-
51
26
  SelectedItem="{Binding SelectedInfo.Value}" />
52
-
53
27
  <ListBox
54
-
55
28
  Grid.Row="2"
56
-
57
29
  DisplayMemberPath="TestNumber"
58
-
59
30
  ItemsSource="{Binding SampleInfos}"
60
-
61
31
  SelectedItem="{Binding SelectedInfo.Value}" />
62
-
63
32
  </Grid>
64
-
65
33
  </Window>
66
-
67
34
  ```
68
35
 
69
-
70
-
71
- ```C#
36
+ ```cs
72
-
73
37
  using System;
74
-
75
38
  using System.Collections.Generic;
76
-
77
39
  using System.Collections.ObjectModel;
78
-
79
40
  using System.Linq;
80
-
81
41
  using System.Reactive.Subjects;
82
-
83
42
  using System.Threading.Tasks;
84
-
85
43
  using System.Windows;
86
-
87
44
  using System.Windows.Data;
88
-
89
45
  using Reactive.Bindings;
90
46
 
91
-
92
-
93
47
  namespace Questions377285
94
-
95
48
  {
96
-
97
49
  public class SampleInfo
98
-
99
50
  {
100
-
101
51
  public int TestNumber { get; set; }
102
-
103
52
  public bool IsSelected { get; set; }
104
-
105
53
  }
106
54
 
107
-
108
-
109
55
  public class ContentGridViewModel
110
-
111
56
  {
112
-
113
57
  public ObservableCollection<SampleInfo> SampleInfos { get; } = new()
114
-
115
58
  {
116
-
117
59
  new() { TestNumber = 1, },
118
-
119
60
  new() { TestNumber = 2, },
120
-
121
61
  new() { TestNumber = 3, },
122
-
123
62
  };
124
-
125
63
  public ReactivePropertySlim<SampleInfo?> SelectedInfo { get; } = new();
126
-
127
64
  public ReactiveCommand Command { get; } = new();
128
-
129
-
130
65
 
131
66
  private readonly Subject<bool> InfoSubject = new();
132
67
 
133
-
134
-
135
68
  public ContentGridViewModel()
136
-
137
69
  {
138
-
139
70
  BindingOperations.EnableCollectionSynchronization(SampleInfos, new());
140
71
 
141
-
142
-
143
72
  SelectedInfo.Subscribe(o =>
144
-
145
73
  {
146
-
147
74
  foreach (var info in SampleInfos)
148
-
149
75
  {
150
-
151
76
  info.IsSelected = info.TestNumber == o?.TestNumber;
152
-
153
77
  }
154
-
155
78
  });
156
-
157
-
158
79
 
159
80
  InfoSubject.Subscribe(o => ReceiveInfo());
160
81
 
161
-
162
-
163
82
  Command.Subscribe(ReceiveInfo);
164
83
 
165
-
166
-
167
84
  _ = Task.Run(async () =>
168
-
169
85
  {
170
-
171
86
  while (true)
172
-
173
87
  {
174
-
175
88
  await Task.Delay(TimeSpan.FromSeconds(5));
176
-
177
89
  InfoSubject.OnNext(true);
178
-
179
90
  }
180
-
181
91
  });
182
-
183
92
  }
184
93
 
185
-
186
-
187
94
  private void ReceiveInfo()
188
-
189
95
  {
190
-
191
96
  var selectedInfo = SelectedInfo.Value;
192
-
193
97
  // *********ココ
194
-
195
98
  SelectedInfo.Value = null;
196
-
197
-
198
99
 
199
100
  SampleInfoListUpdate(Get());
200
101
 
201
-
202
-
203
102
  SelectedInfo.Value = SampleInfos.FirstOrDefault(o => o.TestNumber == selectedInfo?.TestNumber);
204
-
205
103
  }
206
104
 
207
-
208
-
209
105
  private List<SampleInfo> Get()
210
-
211
106
  => Enumerable.Range(1, SampleInfos.Count + 1)
212
-
213
107
  .Select(x => new SampleInfo { TestNumber = x, })
214
-
215
108
  .ToList();
216
109
 
217
-
218
-
219
110
  private void SampleInfoListUpdate(List<SampleInfo> list)
220
-
221
111
  {
222
-
223
112
  SampleInfos.Clear();
224
-
225
113
  foreach (var info in list)
226
-
227
114
  {
228
-
229
115
  SampleInfos.Add(info);
230
-
231
116
  }
232
-
233
117
  }
234
-
235
118
  }
236
119
 
237
-
238
-
239
120
  public partial class MainWindow : Window
240
-
241
121
  {
242
-
243
122
  public MainWindow() => InitializeComponent();
244
-
245
123
  }
246
-
247
124
  }
248
-
249
125
  ```