WPF: ComboBox, сравнивающий объекты на основе идентифицирующего свойства - PullRequest
2 голосов
/ 22 декабря 2010

Допустим, у меня есть класс, назовем его Parent.Этот класс имеет в качестве свойства объект другого класса, назовем его Child.У Child есть идентификатор свойства int.

Теперь экземпляры этих классов основаны на строках в таблицах базы данных.

Итак, предположим, что у Parent есть экземпляр Child с ID = 4, и в моей программе будетвыпадающий список со всеми доступными дочерними экземплярами, чтобы мы могли изменить экземпляр в Parent.

Проблема заключается в том, что из-за неправильного оформления список со всеми дочерними объектами создается в отдельном случае из Child внутри родительского объекта, поэтомудаже если они оба имеют ID = 4, он не распознает их как один и тот же объект (потому что, конечно, это не так).

Однако я все же не хочу, чтобы тот же объект ID был объектом по умолчанию для ComboBox,Я должен как-то, конечно, просто ссылаться на идентификатор как-то, но я немного медленный в темный декабрьский месяц, и я не вижу, как это сделать, потому что это все еще объект, который я устанавливаю, а не только значение 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 ]

6 голосов
/ 23 декабря 2010

, поэтому даже если они оба имеют 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 );
   }
3 голосов
/ 05 декабря 2014

Если кто-то еще сталкивается с этим снова и хочет получить решение 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>

ПРИМЕЧАНИЕ: Очевидно, что не рекомендуется использовать две привязки для выбора, поэтому используйте с осторожностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...