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

WPF:ComboBox,基于标识属性比较对象,wpf,xaml,combobox,Wpf,Xaml,Combobox,假设我有一个类,我们把它命名为父类。这个类有另一个类的对象作为属性,我们称之为子类。子项具有int属性ID 现在,这些类的实例基于数据库表中的行 假设Parent有ID=4的子实例,在我的程序中会有一个包含所有可用子实例的下拉列表,这样我们就可以在Parent中更改该实例 问题是,由于糟糕的设计,包含所有子对象的列表在与父对象中的子对象不同的情况下实例化,因此即使它们都具有ID=4,它也不会将它们识别为相同的对象(因为它当然不是) 但是,我仍然不希望相同的ID对象成为ComboBox的默认对象。

假设我有一个类,我们把它命名为父类。这个类有另一个类的对象作为属性,我们称之为子类。子项具有int属性ID

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

假设Parent有ID=4的子实例,在我的程序中会有一个包含所有可用子实例的下拉列表,这样我们就可以在Parent中更改该实例

问题是,由于糟糕的设计,包含所有子对象的列表在与父对象中的子对象不同的情况下实例化,因此即使它们都具有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>

因此,即使它们都具有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 );
   }

如果其他人再次遇到此问题并需要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>


注意:显然,在选择中使用两个绑定并不是最佳做法,因此请谨慎使用。

Hmm当然可以。我一直在寻找一个解决方案I-XAML,但这当然会起作用,而且更优雅。覆盖等于还不够吗?不,谢谢!我不知道它是如何工作的,但它工作的:-)对我不起作用。覆盖等式是有效的。这与问题中的代码有什么不同?我不认为这是一个糟糕的设计。在应用程序的生命周期内,可以多次获取对象,并且对象将具有不同的地址。我认为在任何UI框架中开发应用程序时,这都是一个常见的问题。在Vue中有
v-bind:key