I'm having an issue with my combo box. Somehow it can get out of sync with itself. For example, after I change out my BlockSequenceFields, only the dropdown text gets altered. Below, the Field 1 has been updated but you can see that it doesn't reflect in the currently selected item.
My IsSynchronizedWithCurrentItem=true should make the currently selected item behave as expected but it doesn't seem to work. I've read many stackoverflow posts where the current item doesn't match but they just set IsSynchronizedWithCurrentItem to true and it fixes their issue.
Can anyone explain why this isn't working for me?
<ComboBox x:Name="SequenceFieldComboBox" SelectedItem="{Binding BlockSequenceFieldIndex, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding BlockSequenceFields, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True"> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <CheckBox IsChecked="{Binding IsCalibrated, Mode=OneWay}" IsEnabled="False"> </CheckBox> <TextBlock Text="{Binding}"> </TextBlock> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> EDIT: Further details for Mr. Chamberlain
// ViewModelBase implements INotifyPropertyChanged public class BlockFieldViewModel : ViewModelBase { public BlockSequenceField SequenceField { get; set; } public List<BlockSequenceCalibrationItemViewModel> Calibrations => this.SequenceField?.CalibrationList; public bool IsCalibrated => this.Calibrations.TrueForAll(x => x.IsCalibrated == null || x.IsCalibrated == true); public double AmplitudeThreshold => this.Calibrations.Max(x => x.Amplitude); public int FieldNumber { get; set; } public override string ToString() { string ret = string.Format(CultureInfo.CurrentCulture, "Field {0} ", this.FieldNumber); if (Math.Abs(this.AmplitudeThreshold) > .00001) { ret = string.Concat(ret, string.Format(CultureInfo.CurrentCulture, "({0} mA)", this.AmplitudeThreshold)); } return ret; } } And here is the larger viewmodel, call it MainViewModel.cs. Here are the relevant fields in the class
private ObservableCollection<BlockFieldViewModel> blockSequenceFields; public ObservableCollection<BlockFieldViewModel> BlockSequenceFields { get => this.blockSequenceFields; set { this.blockSequenceFields = value; this.OnPropertyChanged("BlockSequenceFields"); } } private void RefreshFieldList() { // In order for the combo box text to update, we need to reload the items var savedIndex = this.BlockSequenceFieldIndex; // to restore to current field. var fieldList = this.CalibrationViewModel.FieldViewModels; this.BlockSequenceFields = new ObservableCollection<BlockFieldViewModel>(fieldList); this.BlockSequenceFieldIndex = savedIndex; } 
Tclass in yourpublic ObserveableCollection<T> BlockSequenceFields { get; }IsCalibratedproperty.