WPF:ComboBox,基于标识属性比较对象

时间:2010-12-22 14:29:48

标签: wpf xaml combobox

假设我有一个班级,我们将其命名为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>

2 个答案:

答案 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>

注意:显然,对于选择进行两次绑定,这不是最佳做法,因此请谨慎使用。