C# WPF组合框选择更改未在按下Enter键时激发

C# WPF组合框选择更改未在按下Enter键时激发,c#,.net,wpf,mvvm,combobox,C#,.net,Wpf,Mvvm,Combobox,我正在使用WPF组合框并对SelectionChanged事件执行操作。我还在更改代码隐藏中的集合,不希望触发SelectionChanged事件中的代码。因此,我使用IsDropDownOpen属性来确定下拉源是使用代码更改的还是由应用程序的用户更改的。当我使用鼠标在下拉列表中选择值时,这可以正常工作,但是,如果我使用键盘选择值并按Enter键,则会触发事件,但IsDropDownOpen属性为false。因此,我无法正确确定是使用代码还是应用程序更改下拉选择 代码如下 <ComboBo

我正在使用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*/
    }
}
private void Company_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (cmbCompany.IsDropDownOpen || cmbCompany.IsSelectionBoxHighlighted)
    {
        /*do something here*/
    }
}
如何使用应用程序正确确定下拉选择的更改时间,并在通过代码更改时阻止代码执行

更新

我通过添加对
IsSelectionBoxHighlighted
属性的检查,成功地使代码正常工作。无论使用鼠标还是键盘,只要用户使用下拉菜单选择值,此属性都将返回true。修改后的代码如下所示

<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*/
    }
}
private void Company_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (cmbCompany.IsDropDownOpen || cmbCompany.IsSelectionBoxHighlighted)
    {
        /*do something here*/
    }
}

我在网上找不到有关突出显示的
IsSelectionBox
属性的很多信息。这会导致其他错误吗?或者当设置/重置此属性时,是否存在任何特定的场景?

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

bool _applicationChangingDropdown = false;
在不希望触发SelectionChanged的任何代码的开头将其设置为true,然后将其设置为false

那就用

if(!_applicationChangingDropdown)
{
}

可能重复@Oren正如我所提到的,我已经在使用IsDropDownOpen条件检查,如果用户使用键盘输入键选择值,该检查将不起作用。听起来您可能想使用
OnSelectionChanged
。如果您希望在用户更改所选项目时打开下拉列表,那么if语句不是没用吗?@NETscape该语句有效如果我通过代码更改任何内容,下拉列表将始终在那一刻关闭。我认为这是解决我的问题的方法,但是,我没有考虑到用户可能只使用键盘,这样会失败。