2009-02-03 2 views
1

Я пытаюсь реализовать поведение, подобное Firefox 3 AwesomeBar в WPF. У меня есть ComboBox, чтобы использовать DataTemplate, который делает выпадающее меню похожим на раскрывающийся список для AwesomeBar, но я не уверен, как получить правильное поведение.FF3 AwesomeBar-подобное поведение в WPF

Я хочу, чтобы пользователь вводил их поиск в бит TextBox ComboBox, а затем постепенно сузил результаты в раскрывающемся списке. Я думаю, что я, вероятно, могу получить базу данных, запрашивающую часть этой работы (поскольку результаты будут поступать из базы данных), но я хочу получить раскрывающийся бит, который открывается, как только пользователь начнет печатать (как в Firefox 3), а затем первый элемент в списке будет автоматически выбран, а другие элементы в списке должны быть выбраны с помощью клавиш со стрелками или путем нажатия на них.

Update:

Я теперь нашел программный способ получить ComboBox упасть вниз (используя IsDropDownOpen = истина), но я до сих пор есть несколько других проблем:

Во-первых, когда я печатаю что-то, оно падает, но не выбирает совпадение, наиболее близкое к тому, что я набираю, а во-вторых, когда я печатаю то, что однозначно выбирает элемент, который он автоматически закрывает, и запускает метод SelectedItemChanged. Я хочу, чтобы он только закрывал и запускал код, когда я на самом деле нажал на него или нажал кнопку ввода (вместо того, чтобы просто выбрать его, используя стрелки вверх или вниз). Любые идеи, как заставить его делать то, что я хочу? Я могу дать больше информации, если это недостаточно ясно.

ответ

3

Большая часть функциональности, которую вы хотите, уже находится в ComboBox.

Есть ли программный способ рассказать о списке ComboBox?

Да, вы можете сделать это, установив ComboBox.IsDropDownOpen свойство истинной.

И есть ли способ для выбора предмета без его закрытия и перехода к выбранному элементу?

При установке IsEditable в истинного, он будет выбрать первый элемент, который соответствует введенному тексту для вас - когда вы падаете вниз деталь по-прежнему будет выбраны. Этот пример не выполняет фильтрацию из большего набора данных, но это должно вам начать работу:

<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; 
} 
+0

Thanks.I» Я попробовал это, но это не похоже на раскрывающееся меню, когда я печатаю что-то, что достаточно уникально, чтобы напрямую выбрать элемент. Кроме того, это работает только для выбора элементов, которые начинаются с символов, которые вы вводите - я бы хотел, чтобы он выполнял поиск по всей строке. Любые идеи, как изменить это? – robintw

0

Используйте CollectionView для доступа к своей коллекции.

ListCollectionView _myCollectionView = new ListCollectionView(someCollection); 

Привяжите ComboBox к этой коллекции. Это обеспечит механизм фильтрации. Внедрить метод фильтрации (SearchText в этом коде будет вашим текстом ComboBox ...Я бы хранить это в СП называется SearchText и обновить его из 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); 
Смежные вопросы