【发布时间】:2014-05-08 05:45:37
【问题描述】:
我正在使用 WPF 组合框并对 SelectionChanged 事件执行操作。我也在从代码隐藏中更改集合,并且不希望随后触发 SelectionChanged 事件中的代码。因此,我使用IsDropDownOpen 属性来确定下拉源是使用代码还是由应用程序中的用户更改的。当我使用鼠标在下拉列表中选择值时,这可以正常工作,但是,如果我使用键盘选择值并按 Enter 键,则会触发事件,但 IsDropDownOpen 属性是 false。因此,我无法正确确定是使用代码还是应用程序更改了下拉选择。
代码如下。
<ComboBox SelectionChanged="Company_SelectionChanged"
DisplayMemberPath="Name" Tag="OrgGroupId"
ItemsSource="{Binding CompanyCollection,UpdateSourceTrigger=PropertyChanged}"
SelectedValue="{Binding SelectedCompany,UpdateSourceTrigger=PropertyChanged}"
x:Name="cmbCompany" />
甚至改变的选择如下。
private void Company_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (cmbCompany.IsDropDownOpen)
{
/*do something here*/
}
}
如何正确确定何时使用应用程序更改下拉选择并阻止代码在通过代码更改时执行?
更新
我通过添加对IsSelectionBoxHighlighted 属性的检查来设法使代码正常工作。只要用户使用下拉菜单选择值,无论使用鼠标还是键盘,此属性都会返回 true。修改后的代码如下。
private void Company_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (cmbCompany.IsDropDownOpen || cmbCompany.IsSelectionBoxHighlighted)
{
/*do something here*/
}
}
我在网上找不到很多关于IsSelectionBoxHighlighted 属性的信息。这会导致其他错误吗?或者在设置/重置此属性时是否有任何特殊情况?
【问题讨论】:
-
@Oren 正如我已经提到的,我已经在使用 IsDropDownOpen 条件检查,如果用户使用键盘 Enter 键选择一个值,它就不起作用。
-
听起来你可能会想使用
OnSelectionChanged。 -
如果您希望在用户更改所选项目时打开下拉菜单,那么 if 语句不是没用吗?
-
@NETscape 如果我通过代码更改任何内容,该语句将起作用,下拉菜单将始终在那个时刻关闭。我以为这是我的问题的解决方案,但是,我没有考虑到用户可能只使用键盘,这会失败。