ItemsControl のアイテムにコンボボックスを配置した際、VMからの変更通知がうまく働かない
ItemsControl にコンボボックスを配置した後、コンボボックスの ItemsSource と SelectedItem をほぼ同時に変化させると正常に反映されないという問題にあたっています。
再現コードは以下の通りです。
最初はコンボボックスの内容はhogeのみで、それが選択されており、5秒後にfugaに変化してそれが自動的に選択されることを意図しています。
しかし、実際には5秒後にコンボボックスの項目はfugaに変化しますが、無選択状態になります。
さらに5秒後にfugaが選択されることから、十分に時間をおけばVMからも選択できるということがわかります。
原因、回避方法はありますか。
再現コードでは INotifyPropertyChanged を自力で実装していますが、実際は ReactiveProperty を使用しています。
それぞれのコンボボックスの項目は別のものである必要があります。
// xaml
<Window ... >
<Window.DataContext>
<local:MainWindowContext/>
</Window.DataContext>
<ItemsControl ItemsSource="{Binding Path=DdlList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding Path=Items}" SelectedItem="{Binding Path=Selected}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Window
// データコンテキスト
public class MainWindowContext
{
public List<DdlCtx> DdlList { get; private set; }
public MainWindowContext()
{
DdlList = new List<DdlCtx>()
{
new DdlCtx()
};
_ = Task.Delay(TimeSpan.FromSeconds(5)).ContinueWith(t =>
{
DdlList.First().Update();
});
_ = Task.Delay(TimeSpan.FromSeconds(10)).ContinueWith(t =>
{
DdlList.First().Select();
});
}
}
public class DdlCtx : INotifyPropertyChanged
{
public List<string> Items { get; private set; }
public string Selected { get; set; }
public DdlCtx()
{
Items = new List<string>() { "hoge" };
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Items"));
Selected = Items.First();
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Selected"));
}
public void Update()
{
Items = new List<string>() { "fuga" };
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Items"));
Selected = Items.First();
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Selected"));
}
public void Select()
{
Selected = Items.First();
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Selected"));
}
public event PropertyChangedEventHandler PropertyChanged;
}