如何将ComboBox的SelectedItem绑定到一个从ItemsSource复制的对象?
如何将ComboBox的SelectedItem绑定到一个从ItemsSource复制的对象?
我正在使用WPF的MVVM模式遇到了问题,我可以简化为以下问题:
我有一个CardType模型。
public class CardType { public int Id { get; set; } public string Name { get; set; } }
我有一个使用CardType的视图模型。
public class ViewModel : INotifyPropertyChanged { private CardType selectedCardType; public CardType SelectedCardType { get { return selectedCardType; } set { selectedCardType = value; OnPropertyChanged(nameof(SelectedCardType)); } } public IEnumerable CardTypes { get; set; } // ... and so on ... }
我的XAML有一个ComboBox,它的项基于CardTypes,并根据SelectedCardType预先选择一个项。
由于某些我无法控制的原因,SelectedCardType对象将是CardTypes中项目的参考不相等的副本。因此,WPF无法将SelectedItem与ItemsSource中的项匹配,当我运行应用程序时,ComboBox最初出现没有选择任何项。
我尝试重写CardType上的Equals()和GetHashCode()方法,但WPF仍无法匹配项。
鉴于我的奇特约束,我如何使ComboBox选择正确的项?
admin 更改状态以发布 2023年5月21日
你可以使用SelectedValue和SelectedValuePath:
其中ProductId是一个带有NotifyPropertyChanged的int属性。
在这里阅读一个很好的解释:
SelectedItem,SelectedValue和SelectedValuePath的区别
您可能没有正确覆盖Equals
和GetHashCode
。这个方法可能适用于您。(然而,只覆盖Equals在您的情况下也可以工作,但是当您为一个类覆盖Equals时,覆盖GetHashCode也被认为是良好的做法)
public class CardType { public int Id { get; set; } public string Name { get; set; } public override bool Equals(object obj) { CardType cardType = obj as CardType; return cardType.Id == Id && cardType.Name == Name; } public override int GetHashCode() { return Id.GetHashCode() & Name.GetHashCode(); } }