为什么WPF ComboBox项目没有更新?

我不明白为什么在我的下面的例子中,“Billing Model”combobox在文本框中没有显示属性BillingModel.BillingModelDescription。 选择客户端后,我希望combobox显示当前的billng模型描述,但它保持空白。 绑定到同一事物的文本框确实显示了描述。 我有一些可能的模型作为ItemsSource,它工作正常。 如何在选择客户端时更新计费模型combobox?

这是XAML:

    

和代码隐藏(这只是一个例子,我在完整的应用程序中使用MVVM等,但这有助于说明问题):

 public partial class MainWindow : Window, INotifyPropertyChanged { public MainWindow() { AllClientData = new ObservableCollection(); AllBillingModels = new ObservableCollection(); ClientRate uno = new ClientRate(); uno.BillingModel = new BillingModelType(); uno.BillingModel.BillingModelID = 3; uno.BillingModel.BillingModelDescription = "Free"; uno.ID = 01; uno.EmployerName = "Employer1"; ClientRate dos = new ClientRate(); dos.BillingModel = new BillingModelType(); dos.BillingModel.BillingModelID = 2; dos.BillingModel.BillingModelDescription = "Variable"; dos.ID = 02; dos.EmployerName = "Employer2"; ClientRate tre = new ClientRate(); tre.BillingModel = new BillingModelType(); tre.BillingModel.BillingModelID = 1; tre.BillingModel.BillingModelDescription = "Flat"; tre.ID = 01; tre.EmployerName = "Employer3"; AllClientData.Add(uno); AllClientData.Add(dos); AllClientData.Add(tre); BillingModelType one = new BillingModelType(); one.BillingModelID = 1; one.BillingModelDescription = "Flat"; BillingModelType two = new BillingModelType(); two.BillingModelID = 2; two.BillingModelDescription = "Variable"; BillingModelType three = new BillingModelType(); three.BillingModelID = 3; three.BillingModelDescription = "Free"; AllBillingModels.Add(one); AllBillingModels.Add(two); AllBillingModels.Add(three); InitializeComponent(); this.DataContext = this; } private ObservableCollection _allClientData; public ObservableCollection AllClientData { get { return _allClientData; } set { if (_allClientData != value) { _allClientData = value; FirePropertyChanged("AllClientData"); } } } private ClientRate _selectedClient; ///  /// Gets/Sets Global SelectedClient object ///  public ClientRate SelectedClient { get { return _selectedClient; } set { if (_selectedClient != value) { _selectedClient = value; FirePropertyChanged("SelectedClient"); } } } //private BillingModelType _selectedBillingModel; //public BillingModelType SelectedBillingModel //{ // get // { // return _selectedBillingModel; // } // set // { // if (_selectedBillingModel != value) // { // _selectedBillingModel = value; // FirePropertyChanged("SelectedBillingModel"); // } // } //} private ObservableCollection _allBillingModels; ///  /// Holds all possible billing model types ///  public ObservableCollection AllBillingModels { get { return _allBillingModels; } set { if (_allBillingModels != value) { _allBillingModels = value; FirePropertyChanged("AllBillingModels"); } } } public event PropertyChangedEventHandler PropertyChanged; protected void FirePropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } public class BillingModelType { ///  /// Billing Model ID ///  public int? BillingModelID { get; set; } ///  /// Billing Model Description ///  public string BillingModelDescription { get; set; } } public class ClientRate : INotifyPropertyChanged { ///  /// Employer name with Employer ID in parentheses ///  public string EmployerStr { get { return EmployerName + " (" + ID + ")"; } } ///  /// Employer ID ///  public int? ID { get; set; } private string _EmployerName; ///  /// Employer Official Name ///  public string EmployerName { get { return _EmployerName; } set { if (_EmployerName != value) { _EmployerName = value; FirePropertyChanged("EmployerName"); } } } private BillingModelType _billingModel; ///  /// Rate Type ID and Description ///  public BillingModelType BillingModel { get { return _billingModel; } set { if (_billingModel != value) { _billingModel = value; FirePropertyChanged("BillingModel"); } } } public event PropertyChangedEventHandler PropertyChanged; protected void FirePropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } 

我通过覆盖我的BillingModelType类中的Equals()来解决这个问题。 正如我所怀疑的那样,问题是BillingModel与可能选择列表中使用的BillingModel的实例完全不同。 所以我简单地说:

 public override bool Equals(object obj) { if (obj == null || !(obj is BillingModelType)) return false; return ((BillingModelType)obj).BillingModelID == this.BillingModelID; } public override int GetHashCode() { return this.BillingModelID.GetHashCode(); } 

到BillingModelTypes的类,一切都很好。 感谢Rachel Lim ,因为我在这里找到了关于这个问题的博客: http : //rachel53461.wordpress.com/2011/08/20/comboboxs-selecteditem-not-displaying/#comments

我不确定你期望发生什么,但是你将AllBillingModels添加到所有计费模型中( one three ),它们都显示在combobox中(平面,可变和免费)

编辑:

好的,如果你还在这里,我有一个好主意
对于您的ComboBox Xaml:

     

这会更新combobox中的测试。