绑定时通过属性而不是引用来标识对象,而不覆盖Equals

时间:2019-06-18 13:19:58

标签: c# wpf xaml

我希望绑定到ComboBox的对象由ID而不是引用来标识。无论如何,在XAML中是否可以执行此操作而不覆盖selfEquals

最小示例:

XAML:

GetHashCode

隐藏代码:

<ComboBox
    DisplayMemberPath="Name"
    ItemsSource="{Binding People}"
    SelectedValue="{Binding SelectedPerson}"
    SelectedValuePath="Id" />
<Button
    Height="32"
    Click="ButtonBase_OnClick"
    Content="Test assign" />

如您所见,我正在将public class Person { public int Id { get; set; } public string Name { get; set; } } public partial class MainWindow : Window, INotifyPropertyChanged { private Person _selectedPerson; public MainWindow() { InitializeComponent(); DataContext = this; } public Person SelectedPerson { get => _selectedPerson; set { _selectedPerson = value; OnPropertyChanged(nameof(SelectedPerson)); } } public ObservableCollection<Person> People { get; set; } = new ObservableCollection<Person> { new Person { Id = 1, Name = "Angelina Jolie"}, new Person { Id = 2, Name = "Brad Pitt"} }; private void ButtonBase_OnClick(object sender, RoutedEventArgs e) { SelectedPerson = new Person {Id = 1, Name = "Angelina Jolie"}; // SelectedPerson = People[0]; will work but i don't want that } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } 分配给一个新对象,但是具有相同的名称和ID,但是它不起作用。 ComboBox仍通过引用进行比较。

在Vue和其他框架中,可以指定绑定时用于标识对象的“键”。 SelectedPerson https://vuejs.org/v2/guide/list.html

如果您覆盖v-bind:keyHow do you bind a ComboBox's SelectedItem to an object that is a copy of an item from ItemsSource?,它会起作用,但我想知道是否有任何方法可以避免这种情况。

我希望Equals会做我想做的事,但我错了,它只会影响SelectedValuePath的返回值

2 个答案:

答案 0 :(得分:1)

  

无论如何,在XAML中是否可以做到这一点而不覆盖Equals和GetHashCode?

不,没有。

您可以将SelectedValue的{​​{1}}属性绑定到ComboBox的源属性,即更改int的类型,但是如果要绑定{{ 1}}属性改为SelectedPerson属性,则必须覆盖SelectedItem

答案 1 :(得分:1)

设置时

SelectedValuePath="Id"

SelectedValue绑定的属性应该与Id属于同一类型(与SelectedItem绑定的属性应该与项类型的属性相反)。

例如

SelectedValue="{Binding SelectedPersonId}"

使用

public int SelectedPersonId
{
    get => _selectedPersonId;
    set
    {
        _selectedPersonId = value;
        OnPropertyChanged(nameof(SelectedPersonId));
    }
}

您无需覆盖EqualsGetHashCode