我正在尝试在WPF中实现类似于Firefox 3 AwesomeBar的行为。我有一个ComboBox使用DataTemplate,使得下拉列表看起来像是AwesomeBar的下拉列表,但我不确定如何获得正确的行为。
我想要发生的是用户将其搜索键入ComboBox的TextBox位,然后逐步缩小下拉列表中的结果范围。我想我可能会让数据库查询部分工作(因为结果将来自数据库)但我想要得到的是用户开始输入时打开的下拉位(就像在Firefox中一样) 3)然后列表中的第一个项目将被自动选中,列表中的其他项目可以通过使用箭头键或点击它们来选择。
更新
我现在已经找到了让ComboBox下拉的程序化方法(使用IsDropDownOpen = true),但我还有一些其他问题:
首先,当我输入内容时,它会下降,但它不会选择最接近我正在输入的匹配项,其次当我键入一个唯一选择项目的内容时,它会自动关闭并运行SelectedItemChanged方法。我希望它只在我实际点击它或按下回车时关闭并运行代码(而不是仅使用向上或向下箭头选择它)。任何想法如何让它做我想要的?如果不够清楚,我可以提供更多信息。
答案 0 :(得分: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;
}
答案 1 :(得分: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);