假设我有一个班级,我们将其命名为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>
答案 0 :(得分:6)
所以即使他们都有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 );
}
答案 1 :(得分:3)
如果其他人再次遇到此问题并想要一个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>
注意:显然,对于选择进行两次绑定,这不是最佳做法,因此请谨慎使用。