1

WPFでFirefox3AwesomeBarと同様の動作を実装しようとしています。ドロップダウンをAwesomeBarのドロップダウンのように見せるためのDataTemplateを使用するComboBoxがありますが、正しい動作を取得する方法がわかりません。

私がしたいのは、ユーザーがComboBoxのTextBoxビットに検索を入力してから、ドロップダウンで結果を徐々に絞り込むことです。私はおそらくその一部をデータベースクエリで動作させることができると思います(結果はデー​​タベースから取得されるため)が、取得したいのは、ユーザーが入力を開始するとすぐに開くドロップダウンビットです(Firefoxの場合のように) 3)次に、リストの最初の項目が自動的に選択され、リスト内の他の項目が矢印キーを使用するか、それらをクリックして選択できるようになります。

アップデート:

(IsDropDownOpen = trueを使用して)ComboBoxをドロップダウンさせるプログラム的な方法を見つけましたが、他にもいくつか問題があります。

最初に何かを入力すると、ドロップダウンしますが、入力しているものに最も近い一致が選択されません。次に、アイテムを一意に選択するものを入力すると、自動的に閉じて、SelectedItemChangedメソッドが実行されます。コードを実際にクリックするか、Enterキーを押したときにのみ、コードを閉じて実行したいと思います(上矢印または下矢印を使用してコードを選択しただけではありません)。私がやりたいことをそれを実行させる方法について何かアイデアはありますか?それが十分に明確でない場合、私はより多くの情報を与えることができます。

4

2 に答える 2

3

必要な機能のほとんどは、すでにComboBoxにあります。

ComboBoxリストにドロップダウンするようにプログラムで指示する方法はありますか?

はい、これを行うには、ComboBox.IsDropDownOpenプロパティをtrueに設定します。

そして、リストを閉じて選択されたアイテムになることなく、アイテムを選択する方法はありますか?

IsEditabletrueに設定すると、入力したテキストに一致する最初のアイテムが選択されます。ドロップダウンすると、アイテムは引き続き選択されます。この例では、より大きなデータセットからのフィルタリングは実行されませんが、開始する必要があります。

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:sys="clr-namespace:System;assembly=mscorlib"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid.Resources>
        <x:Array x:Key="data" Type="{x:Type sys:String}">
            <sys:String>Veni</sys:String>
            <sys:String>Vidi</sys:String>
            <sys:String>Vici</sys:String>
        </x:Array>
    </Grid.Resources>
    <ComboBox x:Name="myCombo" ItemsSource="{StaticResource data}" IsEditable="True" PreviewTextInput="myCombo_PreviewTextInput"/>
</Grid>

コードビハインドで、ComboBoxを開きます。ハンドラーはここでもフィルタリングを行う可能性があります。

private void myCombo_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
    myCombo.IsDropDownOpen = true;
}
于 2009-02-03T19:24:20.417 に答える
0

CollectionView を使用してコレクションにアクセスします。

ListCollectionView _myCollectionView = new ListCollectionView(someCollection);

ComboBox をこの CollectionView にバインドします。これが提供するのは、フィルター メカニズムです。フィルタリング メソッドを実装します (このコードの SearchText は ComboBox テキストになります...これを SearchText という名前の DP に格納し、ComboBox から更新します)。

private bool FilterMethod(string expression)
{

     if (expression != null && this.SearchText != null)
     {
          if (expression.ToUpper().Contains(this.SearchText.ToUpper()))
              return true;

          else
              return false;
     }

     return true;
}

ここで、ユーザーが何かを入力したら、CollectionView で次のフィルタリング メソッドを使用します。

_myCollectionView.Filter = new Predicate<string>(FilterMethod);
于 2009-02-09T17:39:51.837 に答える