WPF Combobox SelectionChanged没有触发Enter键

时间:2014-03-28 16:31:45

标签: c# .net wpf mvvm combobox

我正在使用WPF Combobox并对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财产的大量信息。这会导致其他错误吗?或者在设置/重置此属性时是否存在任何特定情况?

1 个答案:

答案 0 :(得分:0)

如何创建一个字段来自己跟踪它。

bool _applicationChangingDropdown = false;

在您不想触发SelectionChanged的任何代码的开头将其设置为true,并在之后将其设置为false。

然后使用

if(!_applicationChangingDropdown)
{
}