前提・実現したいこと
WPFで一定時間ごとにComboBoxの中身を更新し
その際に、ComboBoxの選択状態を元に戻そうとしています。
ComboBoxの中身は更新されますが、選択状態が元に戻っていない状態です。
※未選択状態になっているようです
ComboBoxの項目を選択した際に処理を行いたいので、
ReactivePropertyを使っています。
どのようにすればよいでしょうか?
該当のソースコード
MainWindow.xaml
xaml
1<Window x:Class="WpfApp4.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApp4" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="450" Width="800"> 9 <!--データコンテキスト定義--> 10 <Window.DataContext> 11 <local:MainWindowViewModel /> 12 </Window.DataContext> 13 <Grid> 14 <Grid.RowDefinitions> 15 <RowDefinition Height="auto"/> 16 <RowDefinition /> 17 </Grid.RowDefinitions> 18 <ComboBox ItemsSource="{Binding ListData}" SelectedValue="{Binding SelectedNo.Value, Mode=TwoWay}" Margin="10,0,10,0"></ComboBox> 19 </Grid> 20</Window>
MainWindowViewModel.cs
cs
1using Reactive.Bindings; 2using Reactive.Bindings.Extensions; 3using System; 4using System.ComponentModel; 5using System.Reactive.Disposables; 6using System.Reactive.Linq; 7using System.Security.Cryptography; 8using System.Text; 9 10namespace WpfApp4 11{ 12 public class MainWindowViewModel 13 : INotifyPropertyChanged 14 { 15 public event PropertyChangedEventHandler PropertyChanged; 16 private CompositeDisposable Disposable { get; } = new CompositeDisposable(); 17 18 public ReactiveCollection<string> ListData { get; private set; } 19 20 public ReactiveProperty<string> SelectedNo { get; set; } 21 22 23 public MainWindowViewModel() 24 { 25 this.ListData = new ReactiveCollection<string>(); 26 this.SelectedNo = new ReactiveProperty<string>(); 27 // コンボ選択時の処理 28 this.SelectedNo.Subscribe(_ => 29 { 30 // 何か処理 31 }); 32 33 // 一定時間ごとに処理を実行 34 Observable.Timer(TimeSpan.FromMilliseconds(500), TimeSpan.FromMilliseconds(10000)) 35 .Subscribe(x => 36 { 37 var selectedNo = this.SelectedNo.Value; 38 // リスト更新 39 this.ListDataUpdate(); 40 // リストの選択状態を戻す 41 this.SelectedNo.Value = selectedNo; 42 }).AddTo(this.Disposable); 43 } 44 45 private void ListDataUpdate() 46 { 47 var @byte = new byte[sizeof(int)]; 48 using (var crypto = new RNGCryptoServiceProvider()) 49 crypto.GetBytes(@byte); 50 var seed = BitConverter.ToInt32(@byte, 0); 51 var random = new Random(seed); 52 int max = random.Next(50); 53 54 // リスト更新 55 this.ListData.ClearOnScheduler(); 56 for (int i = 1; i <= max; i++) 57 { 58 this.ListData.AddOnScheduler(i.ToString()); 59 } 60 } 61 } 62} 63
補足情報(FW/ツールのバージョンなど)
.NET Core 3.1
ReactiveProperty 7.8.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/22 13:33