MVVM / WPF - 当用户在文本框中键入时,始终显示组合框下拉列表

时间:2016-12-16 16:36:15

标签: c# wpf mvvm

我想在用户在文本框中输入时强制下拉打开。

我有逻辑来过滤列表,当我没有将任何东西绑定到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(文本的项目源)时,它都会过滤下拉列表的itemsource。我现在拥有它以便ShowDropDown(我为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 个答案:

答案 0 :(得分:1)

只是一个观察,但IsDropDownOpen是一个布尔属性,看起来好像你正在使用BoolToVisibility转换器。