2017-08-31 106 views
0

我遇到了与我的组合框有关的问题。不知怎的,它可能会与自己不同步。例如,在我更换BlockSequenceFields后,只有下拉文本被修改。在下面,字段1已更新,但您可以看到它不反映在当前选定的项目中。WPF组合框不会更新当前选定的项目

enter image description here

我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; 
    } 
+0

请向我们展示您的ViewModel,您的DataContext设置为组合框。我正在寻找'公共ObservedableCollection中的'T'类代码BlockSequenceFields {get; }' –

+0

也许你忘了添加INotifyPropertyChanged接口到你的viewModel? – Demon

+0

@ScottChamberlain我相当肯定datacontext是作为组合框更新的一部分正确设置的。但是,我会明确地设置datacontext并查看它是否有效。我没有用于设置datacontext的代码,因此我将在xaml中执行此操作。 – user2619824

回答

1

您的问题是,因为BlockFieldViewModel时引起FieldNumber更新不会引发INPC。您需要至少为该财产筹集资金。

//Assuming the base class looks like 
public class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 


public class BlockFieldViewModel : ViewModelBase 
{ 
    //... 

    public int FieldNumber 
    { 
     get 
     { 
      return _fieldNumber; 
     } 
     set 
     { 
      if(_fieldNumber.Equals(value)) 
       return; 

      OnPropertyChanged(); 
     } 
    } 
    //... 
} 

我不知道是否这将解决您的问题或没有,由于您使用的ToString()显示的名称。如果你发现以上未在传递一个空字符串您OnPropertyChanged方法

public int FieldNumber 
{ 
    get 
    { 
     return _fieldNumber; 
    } 
    set 
    { 
     if(_fieldNumber.Equals(value)) 
      return; 

     //Refresh all properties due to the .ToString() not updating. 
     OnPropertyChanged(""); 
    } 
} 

而且修复它触发改变整个对象的属性,如果List<BlockSequenceCalibrationItemViewModel> Calibrations可以添加或删除,或.Amplitude可能改变你也需要触发一个名字的刷新。

+0

@ user2619824你可以添加'BlockSequenceCalibrationItemViewModel'和'BlockSequenceField'的代码,我可以做一个完整的例子来解决所有这些问题。 –

相关问题