【发布时间】:2018-05-12 11:54:48
【问题描述】:
我在 WPF 表单中使用了一个 ComboBox,它似乎表现出奇怪的行为,在选择下拉项后立即从 ComboBox 中清除文本,然后在 ComboBox 中键入文本。
首先了解一些背景信息,我的 ComboBox 包含一个 ComboBoxItem 列表,其中 Content 属性设置为各种字符串值(在我的示例应用程序中,我使用了水果名称)。 ComboBox 本身的所有属性都设置为默认值,除了 IsEditable 属性(设置为 true)和 IsTextSearchEnabled 属性(设置为 false)。
<ComboBox x:Name="comboBox" HorizontalAlignment="Left" VerticalAlignment="Top" Width="120" Margin="121,100,0,0" IsEditable="True" KeyUp="comboBox_KeyUp" IsTextSearchEnabled="False">
<ComboBoxItem Content="apple"/>
<ComboBoxItem Content="banana"/>
<ComboBoxItem Content="grape"/>
<ComboBoxItem Content="lemon"/>
<ComboBoxItem Content="strawberry"/>
</ComboBox>
我还使用了在组合框的 KeyUp 事件期间触发的基本过滤器:
private void comboBox_KeyUp(object sender, KeyEventArgs e)
{
var combobox = (ComboBox)sender;
combobox.IsDropDownOpen = true;
CollectionView itemsViewOriginal = (CollectionView)CollectionViewSource.GetDefaultView(combobox.Items);
itemsViewOriginal.Filter = ((o) =>
{
if (String.IsNullOrEmpty(combobox.Text))
{
return true;
}
else
{
if (((ComboBoxItem)o).Content.ToString().StartsWith(combobox.Text, true, null))
{
return true;
}
else
{
return false;
}
}
});
itemsViewOriginal.Refresh();
}
当我从下拉列表中选择一个项目,单击组合框以删除突出显示并将焦点放在单词的末尾,然后键入时,会出现此问题。只要我输入一个字母,文本就会立即被删除,我输入的任何新文本都会重新启动过滤器。我希望新文本简单地附加到组合框中的现有文本,但这里不是这种情况。
有趣的是,我可以通过两种方式解决这个问题:
a) 重新启用“IsTextSearchEnabled”。但是,出于各种原因,我不希望启用此属性,主要是行为与客户端期望控件的行为方式不一致。
b) 修改过滤器以使用静态值。
如果我将过滤器修改为:
if (((ComboBoxItem)o).Content.ToString().StartsWith(combobox.Text, true, null))
到:
if (((ComboBoxItem)o).Content.ToString().StartsWith("ba", true, null))
然后清除文本行为不再发生。但是,这显然对我没有帮助,因为我想使用 ComboBox 的文本作为列表的过滤器。
在这种情况下,我可以做些什么来防止文本从控件中删除,同时仍保持过滤和一般控件行为?
【问题讨论】:
-
过滤
Items集合是自找麻烦。ComboBox尝试将所选项目与Text属性同步。当您过滤Items使其实际上为空时,组合框显然会认为,“哦,没有可能的选择,所以我当前的选择不可能有效。我会继续清除它以及我的文本。 "ComboBox可能不是用于这种情况的最佳控件。我建议你寻找一个可以使用自动完成的第三方文本控件。 -
我能问一下你为什么不使用任何绑定吗? WPF 最常与the MVVM pattern 一起使用,它也可以解决很多类似的问题