如何将ComboBox的SelectedItem绑定到一个从ItemsSource复制的对象?

18 浏览
0 Comments

如何将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日
0
0 Comments

你可以使用SelectedValue和SelectedValuePath:


其中ProductId是一个带有NotifyPropertyChanged的int属性。

在这里阅读一个很好的解释:
SelectedItem,SelectedValue和SelectedValuePath的区别

0
0 Comments

您可能没有正确覆盖EqualsGetHashCode。这个方法可能适用于您。(然而,只覆盖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();
    }
}

0