假设我有一个类,我们将它命名为Parent.这个类有一个属性作为另一个类的对象,我们称之为Child.Child具有int属性ID.
现在,这些类的实例基于数据库表中的行.
所以让我们说Parent有ID = 4的Child实例,在我的程序中会有一个包含所有可用Child实例的Dropdown列表,所以我们可以在Parent中更改实例.
问题是,由于设计不良,所有子对象的列表都是在父级内的Child的单独场合实例化的,所以即使它们都有ID = 4,它也不会将它们识别为同一个对象(因为它当然不是是的.
但是我仍然不是同一个ID对象是ComboBox的默认对象.我当然应该以某种方式引用ID,但在12月的黑暗月份我有点慢,我没有看到如何做到这一点,因为它仍然是我设置的对象不仅仅是int值.
这是XAML代码:
<DataTemplate x:Key="EditTemplate" DataType="{x:Type data:Parent}">
<ComboBox ItemsSource="{Binding ElementName=Panel, Path=DataContext.ChildList}"
SelectedItem="{Binding Path=Child, Mode=TwoWay}"
SelectedValuePath="ID" DisplayMemberPath="Name" />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
所以,即使它们都有ID = 4,它也不会将它们识别为同一个对象(因为它当然不是)
听起来根本问题是相等,覆盖给定子对象的必要方法,以达到适合您需要的相等定义.
public override bool Equals(object obj)
{
Child other = obj as Child;
if( other == null )
{
return false;
}
return (this.Id == other.Id);
}
public override int GetHashCode()
{
return this.Id.GetHashCode();
}
public static bool operator == (Child me, Child other)
{
return Equals(me, other);
}
public static bool operator != (Child me, Child other)
{
return Equals( me, other );
}
Run Code Online (Sandbox Code Playgroud)
如果其他人再次遇到此问题并需要 XAML 解决方案,您还可以使用 SelectedValuePath 和 SelectedValue 属性以及 SelectedItem 属性。
<DataTemplate x:Key="EditTemplate" DataType="{x:Type data:Parent}">
<ComboBox ItemsSource="{Binding ElementName=Panel, Path=DataContext.ChildList}"
SelectedItem="{Binding Path=Child, Mode=TwoWay}"
SelectedValue="{Binding Path=Child.ID, Mode=OneWay}"
SelectedValuePath="ID" DisplayMemberPath="Name" />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
注意:显然,对选择进行两个绑定并不是最佳实践,因此请谨慎使用。