我希望绑定到ComboBox的对象由ID而不是引用来标识。无论如何,在XAML中是否可以执行此操作而不覆盖self
和Equals
?
最小示例:
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:key
:How do you bind a ComboBox's SelectedItem to an object that is a copy of an item from ItemsSource?,它会起作用,但我想知道是否有任何方法可以避免这种情况。
我希望Equals
会做我想做的事,但我错了,它只会影响SelectedValuePath
的返回值
答案 0 :(得分:1)
无论如何,在XAML中是否可以做到这一点而不覆盖Equals和GetHashCode? p>
不,没有。
您可以将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));
}
}
您无需覆盖Equals
和GetHashCode
。