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

vsikbqxv  于 2022-12-07  发布在  其他
关注(0)|答案(2)|浏览(177)

假设我有一个类,我们把它命名为Parent,这个类的属性是另一个类的一个对象,我们把它命名为Child,Child的属性ID是int.
现在,这些类的示例基于数据库表中的行。
因此,假设Parent有ID=4的Child示例,在我的程序中将有一个下拉列表,其中包含所有可用的Child示例,这样我们就可以在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>
busg9geu

busg9geu1#

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

nlejzf6q2#

如果其他人再次遇到这种情况并需要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>

**注意:**很明显,这不是对选择进行两个绑定的最佳做法,因此请谨慎使用。

相关问题