2010-12-22 74 views
1

比方说,我有一个类,让我们将其命名为父。这个类拥有另一个类的一个对象,我们称之为Child。孩子有一个int属性ID。WPF:组合框,比较基于标识属性的对象

现在这些类的实例基于数据库表中的行。

因此,假设Parent有ID = 4的Child实例,并且在我的程序中会有一个包含所有可用Child实例的下拉列表,因此我们可以更改Parent中的实例。

问题在于,由于设计不好,带有所有子对象的列表在独立的场合从父级内的子实例进行实例化,因此即使它们都具有ID = 4,它也不会将它们识别为相同的对象(因为当然不是)。

但是,我仍然不想将相同的ID对象作为ComboBox的默认ID对象。我当然应该以某种方式参考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> 

回答

5

所以即使它们都具有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); 
    } 
+0

嗯,当然应该工作。我一直在寻找XAML的解决方案,但是这当然可以工作,并且更加优雅。 – 2010-12-23 09:08:47

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> 

注:显然,这不是有两个绑定的选择,所以请谨慎使用的最佳实践。

+0

谢谢!不知道它是如何工作的,但它的工作原理是:-) – Endrju 2017-12-03 14:30:51