【发布时间】:2012-01-30 21:52:43
【问题描述】:
所以我有一个与 DataSet 绑定的 ComboBox,我希望仅在更改选择时触发事件。我尝试使用 SelectionChanged 事件,但只要有建议的项目就会触发。例如,如果我输入“eb”,那么“ebtoulson”将被选中,“toulson”突出显示。我的问题是如何禁止此事件触发建议,还是我使用了错误的事件?任何建议将不胜感激。
【问题讨论】:
-
您找到解决问题的方法了吗?
所以我有一个与 DataSet 绑定的 ComboBox,我希望仅在更改选择时触发事件。我尝试使用 SelectionChanged 事件,但只要有建议的项目就会触发。例如,如果我输入“eb”,那么“ebtoulson”将被选中,“toulson”突出显示。我的问题是如何禁止此事件触发建议,还是我使用了错误的事件?任何建议将不胜感激。
【问题讨论】:
当您输入并出现建议时,您实际上是在更改所选项目,因此应该触发事件。
您有什么特别需要使它仅适用于 UI?
【讨论】:
我想出了这个解决方案。我认为这不是最理想的,但它涵盖了您的情况。我正在使用PreviewTextInput 事件来处理通过文本输入的选择,并使用DropDownClosed 来处理通过鼠标进行的选择。我的ComboBox控件名为cbTest1,我使用的代码如下:
private void cbTest1_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
var q = from i in cbTest1.ItemsSource.Cast<ComboBoxItem>()
where ((string)i.Content).StartsWith(e.Text, StringComparison.OrdinalIgnoreCase)
select i;
if (q.Count() == 1)
{
// Have typed out a unique name match.
var ActiveItem = cbTest1.SelectedItem;
}
else
{
// Name does not match or has multiple matches.
}
}
private void cbTest1_DropDownClosed(object sender, EventArgs e)
{
var ActiveItem = cbTest1.SelectedItem;
}
它使用 Linq 表达式来确定用户迄今为止键入的内容是否已将选择范围缩小到单个项目。但是,对于您的情况,该查询的成本可能太高。试试看,然后告诉我。
【讨论】: