前提・実現したいこと
WPF、C#、Prism、ReactiveProperty
別スレッドで処理を流しておき変更があった場合、変更を通知してCombboxを更新するようにしたい。
選択済みの場合リスト更新後も選択した項目が残っていた場合、再選択するようにしたい。
試したこと
C#
1public class ContentGridViewModel : BindableBase, INavigationAware 2{ 3 public ObservableCollection<SampleInfo> SampleInfos { get; } 4 public ReactivePropertySlim<SampleInfo> SelectedInfo { get; } 5 6 public ContentGridViewModel(IContentGridService contentGridService, IRegionManager regionManager) 7 { 8 SampleInfos = new ObservableCollection<SampleInfo>(); 9 SelectedInfo = new ReactivePropertySlim<SampleInfo>(); 10 11 BindingOperations.EnableCollectionSynchronization(SampleInfos, new object()); 12 13 SampleInfos.AddRange(別クラスに保持しているリストを設定); 14 15 // コンボボックス選択時イベント 16 SelectedInfo.Subscribe(o => 17 { 18 foreach (var info in SampleInfos) 19 { 20 info.IsSelected = info?.TestNumber == o?.TestNumber; 21 } 22 }).AddTo(Disposable); 23 } 24 25 public async void OnNavigatedTo(NavigationContext navigationContext) 26 { 27 // 接続情報取得後Subject 28 SampleService.InfoSubject = new Subject<bool>(); 29 SampleService.InfoSubject.Subscribe(o => ReceiveInfo()); 30 } 31 32 // 別スレッドで変更を監視して変更があった場合、Subjectを使って変更を通知してReceiveInfo関数を呼ぶ。 33 private void ReceiveInfo() 34 { 35 var selectedInfo = SelectedInfo.Value; 36 37 // コンボボックスリストの内容更新処理 38 SampleInfoListUpdate(別クラスに保持しているリストを設定); 39 40 // コンボボックス再選択 41 var tmp = SampleInfos.Where(o => o.TestNumber == selectedInfo.TestNumber).ToList(); 42 SelectedInfo.Value = tmp.FirstOrDefault(); 43 } 44 45 // コンボボックスリストの内容更新処理 46 private void SampleInfoListUpdate(List<SampleInfo> list) 47 { 48 SampleInfos.Clear(); 49 foreach (var info in list) 50 { 51 SampleInfos.Add(info); 52 } 53 } 54}
xaml
1<ComboBox Grid.Row="1" 2 ItemsSource="{Binding SampleInfos}" 3 SelectedItem="{Binding Path=SelectedInfo.Value}" 4 DisplayMemberPath="TestNumber" />
コンボボックスの内容は更新されているが、選択項目の再設定が出来ない。
試しに未選択の状態でReceiveInfoを動かしリストの先頭を選択するようにすると先頭の項目が選択状態になるが、
選択済みにしてReceiveInfoを動かし先頭項目を選択済みにすると未選択状態になる。
別スレッドからの更新の場合、SelectedItemに設定する場合何かしないといけないのでしょうか?
解決方法を教えて頂けたら幸いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。