2016-12-16 2 views
2

Я хочу заставить раскрывающийся список открыть, когда пользователь вводит текстовое поле.MVVM/WPF - всегда показывайте выпадающий список combobox, когда пользователь вводит текстовое поле

У меня есть логика для фильтрации списка, и когда я не привязываю ничего к элементу IsDropDownOpen, он работает по желанию, за исключением случаев, когда текстовое поле теряет фокус, а затем переориентируется, выпадающее меню не возвращается, если только я щелкните стрелку.

<ComboBox x:Name="nodeList" 
    Text="{Binding UserInput, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    ItemsSource="{Binding NodeTokenList}" DisplayMemberPath="FullNodeName" 
    HorizontalAlignment="Left" VerticalAlignment="Top" Width="324" 
    Margin="162,49,0,0" Height="32" 
    IsDropDownOpen="{Binding Path=ShowDropDown, Mode=TwoWay, Converter= {StaticResource BoolToVis}, UpdateSourceTrigger=PropertyChanged}" /> 

Выше моего xaml.

Каждый раз, когда UserInput изменяется (исходный текст для текста), он фильтрует источник items для выпадающего списка. Теперь у меня есть это так, чтобы ShowDropDown (мой BOOL для IsDropDownOpen)

Вот мой UserInput и определение ShowDropDown:

public string UserInput 
{ 
    get { return _userInput; } 
    set 
     { 
      _userInput = value; 
      FilterListOnKeyPress(); 
      OnPropertyChanged("UserInput");        
     } 
} 

public bool ShowDropDown 
{ 
    get { return _showDropDown; } 
    set 
     { 
      _showDropDown = value; 
      OnPropertyChanged("ShowDropDown"); 
     } 
} 

и, наконец, вот моя реализация FilterListOnKeyPress()

private void FilterListOnKeyPress() 
{ 
    if (string.IsNullOrEmpty(UserInput)) 
    { 
     NodeTokenList = BackUpNodeTokenList; 
     return; 
    } 
    else 
    { 
     NodeTokenList = BackUpNodeTokenList.Where(x => x.FullNodeName.ToLower().Contains(UserInput.ToLower())).ToList(); 
       ShowDropDown = true; 
     } 
} 
+1

Интересно, может ли AutoCompleteBox быть лучшим вариантом в этом случае. – ChrisF

+0

Вам, вероятно, необходимо явно обработать GetFocus, например: http://stackoverflow.com/questions/1217268/how-to-get-notified-when-a-window-get-focus-in-wpf –

+0

'ShowDropDown 'не является mvvm. И MVVM не означает «никакого кода». Отображая пользователя, выпадающий список является функцией пользовательского интерфейса. Управлять логикой в ​​пользовательском интерфейсе. – Will

ответ

1

Просто наблюдение, но IsDropDownOpen является логическим свойством, и похоже, что вы используете на нем конвертер BoolToVisibility.

+0

Ничего себе я думаю, что решил, спасибо –

Смежные вопросы