【问题标题】:WPF: ComboBox, comparing objects based on identifying propertyWPF:ComboBox,根据识别属性比较对象
【发布时间】:2010-12-22 14:29:47
【问题描述】:

假设我有一个类,我们将其命名为 Parent。这个类具有另一个类的对象作为属性,我们称它为子类。 Child 有一个 int 属性 ID。

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

假设 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>

【问题讨论】:

  • 我不认为这是一个糟糕的设计。在应用程序的生命周期中可以多次获取对象,并且它们将具有不同的地址。我认为这是在任何 UI 框架中开发应用程序时的常见问题。在 Vue 中有 v-bind:key

标签: wpf xaml combobox


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 谢谢!不知道它是如何详细工作的,但它可以工作:-)
  • 对我不起作用。不过,压倒一切的平等是有效的。
  • 这与问题中的代码有何不同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-17
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多