2016-12-16 6 views
2

ユーザーがテキストボックスに入力するときにドロップダウンを強制したいです。MVVM/WPF - ユーザーがテキストボックスに入力するときにコンボボックスのドロップダウンリストを常に表示します。

私はリストをフィルタリングするロジックを持っていますが、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がフィルタリングされます。 I 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

このケースでは、オートコンプリートボックスが最適なオプションかどうかと思います。 – ChrisF

+0

GetFocusを明示的に処理する必要があります。例:http://stackoverflow.com/questions/1217268/how-to-get-notified-when-a-window-get-focus-in-wpf –

+0

'ShowDropDown 'はmvvmではありません。 MVVMは「コードビハインドなし」を意味するものではありません。ドロップダウンはUI機能です。 UIのロジックを処理します。 – Will

答えて

1

ただの観測ですが、IsDropDownOpenはブール値のプロパティで、BoolToVisibilityコンバーターを使用しているかのように見えます。

+0

うわー、私はそれを解決したと思う、ありがとう –

関連する問題