Combobox показывает связанные значения, но выбор невозможен

У меня действительно странное поведение с комбобоксом. Threre - это ObservabalCollection, связанная с ним. Значения отображаются правильно. Я могу добавить некоторые значения в мою коллекцию, привязанную к combobox_PragmaSections, они отображаются, и я могу переключаться между ними.

Есть несколько текстовых полей и DoubleUpDown, где я могу установить некоторые свойства выбранного элемента combobox_PragmaSections.

Когда я вставляю некоторые значения в Textbox или DoubleUpDown, combobox_PragmaSections "зависает". Показывает содержащиеся значения, возможно выпадающее меню, НО, если я пытаюсь выбрать другое значение, кроме текущего, ничего не происходит. Когда я удаляю свои функции isEqual и getHashCode, это работает.... у кого-нибудь есть идея, что происходит?

<ComboBox x:Name="combobox_PragmaSections" ItemsSource="{Binding currentTask.list_PragmaSections}"
DisplayMemberPath="ViewName" Margin="13,271,10,0" VerticalAlignment="Top"
Grid.Column="1"/>

<TextBox Text="{Binding SelectedItem.Name,ElementName=combobox_PragmaSections}" 
    Height="23" Margin="13,298,10,0" TextWrapping="Wrap" 
    VerticalAlignment="Top" Grid.Column="1"/>



<TextBox Text="{Binding SelectedItem.FLAGS, ElementName=combobox_PragmaSections}" Height="23" Margin="13,324,10,0" 
        TextWrapping="Wrap" VerticalAlignment="Top" Grid.Column="1"/>

<xctk:DoubleUpDown Value="{Binding SelectedItem.Alignment,
ElementName=combobox_PragmaSections}" Margin="96,353,10,0"
VerticalAlignment="Top" Grid.Column="1" Height="20"/>


    public override bool Equals(System.Object obj)
    {
        // If parameter is null return false.
        if (obj == null)
        {
            return false;
        }

        // If parameter cannot be cast to Point return false.
        Task_PragmaSection p = obj as Task_PragmaSection;
        if ((System.Object)p == null)
        {
            return false;
        }
        bool isEqual = false;
        // If parameter is null return false:
        if ((object)p == null)
        {
            return false;
        }
        if (this.Unit == p.Unit &&
           this.Size == p.Size &&
           this.FLAGS == p.FLAGS &&
           this.File_Path == p.File_Path &&
           this.Description == p.Description &&
           this.completeSection == p.completeSection &&
           this.Alignment == p.Alignment &&
           this.Name == p.Name &&
           this.ViewName == p.ViewName &&
           this.Type == p.Type &&
           this.Qualifier == p.Qualifier &&
           this.list_Objects == p.list_Objects)
        {
            isEqual = true;
        }
        // Return true if the fields match:
        return isEqual;
    }
    public override int GetHashCode()
    {
        unchecked
        {
            int hash = 486187739;
            if (this.Name!=null)
            {
                hash = hash * 23 + this.Name.GetHashCode();
            }
            if(this.ViewName!=null)
            {
                hash = hash * 23 + this.ViewName.GetHashCode();
            }
            if(this.Alignment!=null)
            {
                hash = hash * 23 + this.Alignment.GetHashCode();
            }
            return hash;
        }
    }

1 ответ

Решение

Ваш GetHashCode() выглядит некорректно, поскольку возвращаемое реализацией значение будет меняться в течение времени жизни объекта (после того, как назначены Name, ViewName или Alignment). Это означает, что экземпляры могут быть потеряны в словарях или хэш-наборах. Если вам не нужно помещать свои объекты как ключи в словарь (и вы почти всегда можете найти альтернативу), вам не следует переопределять GetHashCode().

Другие вопросы по тегам