KyloRen
KyloRen

Reputation: 2741

Editable ComboBox selects first entered character

I am having issues with a ComboBoxselecting the first entered character, which then causes the a problem where the second entered character overwrites the first one.

EDIT: A small explanation of what I an trying to do. I have set up the ComboBox to act as an autocomplete control. When I enter a character, I am using CollectionView class to filter any names that match each entered character. Upon entered text the ComboBox drop down menu needs to open up, which is why I am binding to IsDropDownOpen. This is how it is supposed to look here.

This is beyond me, I can't research what I need to do to stop this behavior.

Here is a screen shot of what I mean.

enter image description here

This is the ComboBox XAML:

<ComboBox Style="{StaticResource ComboBoxToggleHidden}" 
      DisplayMemberPath="FullName" SelectedValuePath="Key"
      IsTextSearchEnabled="False" 
      IsEditable="True" 
      StaysOpenOnEdit="True" 
      Text="{Binding Path=EnteredText, UpdateSourceTrigger=PropertyChanged}" 
      ItemsSource="{Binding Path=Employees}" 
      SelectedItem="{Binding UpdateSourceTrigger=PropertyChanged, Path=SelectedEmployee}" 
      IsDropDownOpen="{Binding IsDropDown}">
</ComboBox>

EDIT: I have narrowed it down to this, IsDropDown = true;, commenting this out fixes the issue. But I need the drop down when editing the ComboBox

In the EnteredText property

private string _enteredText;

public string EnteredText
{
    get { return _enteredText; }
    set
    {
        _enteredText = value;
        Filter(value);
        IsDropDown = true;
        OnPropertyChanged();
    }
}


public bool IsDropDown { get; set; }  

Upvotes: 1

Views: 818

Answers (2)

TT7
TT7

Reputation: 31

Consider this as another solution. It mights resove the side effect of above mentioned problem.

I am expecting the TemplateChild to have the Name (PART_EditableTextBox). If you are changing the name in the Template then please do the necessary changes here as well.

    private TextBox EditableTextBox => (TextBox)GetTemplateChild("PART_EditableTextBox");

    protected override void OnDropDownOpened(EventArgs e)
    {
        EditableTextBox.Select(Text.Length, 0);
        base.OnDropDownOpened(e);
    }

Upvotes: 0

KyloRen
KyloRen

Reputation: 2741

OK, I solved this doing a hack, but it will have to do until I can figure out why this behavior is happening.

I created an KeyUpEvent Event in the constructor,

EventManager.RegisterClassHandler(typeof(TextBox), TextBox.KeyUpEvent,
            new RoutedEventHandler(DeselectText));

Then in the Handler I just deselected the text.

private void DeselectText(object sender, RoutedEventArgs e)
{
   var textBox = e.OriginalSource as TextBox;
   if (textBox == null) return;
   if (textBox.Text.Length >= 2) return;
   textBox.SelectionLength = 0;
   textBox.SelectionStart = 1;
}

I know this is a hack, but I have no choice until the correct solution is posted.

This is how it looks with the hack. enter image description here

Upvotes: 2

Related Questions