1

我正在尝试在 WPF 中实现类似于 Firefox 3 AwesomeBar 的行为。我有一个 ComboBox 来使用 DataTemplate,它使下拉菜单看起来像 AwesomeBar 的下拉菜单,但我不确定如何获得正确的行为。

我想要发生的是让用户将他们的搜索输入到 ComboBox 的 TextBox 位中,然后逐渐缩小下拉列表中的结果。我想我可能可以让数据库查询部分工作(因为结果将来自数据库)但我想要得到的是用户开始输入时打开的下拉位(就像在 Firefox 中一样3) 然后自动选择列表中的第一个项目和列表中的其他项目,可以通过使用箭头键或单击它们来选择它们。

更新:

我现在找到了让 ComboBox 下拉的编程方式(使用 IsDropDownOpen = true),但我还有一些其他问题:

首先,当我输入某些内容时,它会下拉,但它不会选择与我正在输入的内容最接近的匹配项,其次,当我输入唯一选择一个项目的内容时,它会自动关闭并运行 SelectedItemChanged 方法。我希望它仅在我实际单击它或按 Enter 时关闭并运行代码(而不是仅使用向上或向下箭头进行选择)。任何想法如何让它做我想做的事?如果还不够清楚,我可以提供更多信息。

4

2 回答 2

3

您想要的大部分功能已经在 ComboBox 中。

有没有一种编程方式来告诉 ComboBox 列表下拉?

是的,您可以通过将ComboBox.IsDropDownOpen属性设置为true来做到这一点。

有没有办法在不关闭列表并成为选定项目的情况下选择项目?

当您将IsEditable设置为true时,它​​将为您选择与输入文本匹配的第一个项目 - 当您下拉该项目时仍将被选中。此示例不会从更大的数据集执行过滤,但它应该可以帮助您入门:

<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 回答