我遇到了与我的组合框有关的问题。不知怎的,它可能会与自己不同步。例如,在我更换BlockSequenceFields后,只有下拉文本被修改。在下面,字段1已更新,但您可以看到它不反映在当前选定的项目中。WPF组合框不会更新当前选定的项目
我IsSynchronizedWithCurrentItem =真应该让当前选定的项目像预期的那样,但它似乎并没有工作。我读过很多目前的项目不匹配的stackoverflow帖子,但他们只是将IsSynchronizedWithCurrentItem设置为true,它修复了他们的问题。
任何人都可以解释为什么这不适合我吗?
<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>
编辑:张伯伦先生
// 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;
}
}
这里是更大的视图模型的更多细节,把它MainViewModel.cs。下面是在类相关领域
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;
}
请向我们展示您的ViewModel,您的DataContext设置为组合框。我正在寻找'公共ObservedableCollection中的'T'类代码BlockSequenceFields {get; }' –
也许你忘了添加INotifyPropertyChanged接口到你的viewModel? – Demon
@ScottChamberlain我相当肯定datacontext是作为组合框更新的一部分正确设置的。但是,我会明确地设置datacontext并查看它是否有效。我没有用于设置datacontext的代码,因此我将在xaml中执行此操作。 – user2619824