WPF组合框选择更改事件触发两次

WPF组合框选择更改事件触发两次,wpf,datagrid,wpf-controls,Wpf,Datagrid,Wpf Controls,在我的DataGrid中,我使用了datagridcomboxcolumn,如下所示。它的SelectionChanged事件(定义如下)总是会触发两次—一次是在我单击某个项目时触发,另一次是在我从下拉列表中选择新项目时触发。当我单击要更改的项目时,SelectionChanged事件将激发并显示旧值,然后当我选择新值时,它将再次激发并正确显示新值。但是我只希望在为combobox选择新值时触发事件 问题:是什么导致了这种行为以及如何解决该问题 备注:许多在线用户似乎都发布了类似的问题,但他们都

在我的
DataGrid
中,我使用了
datagridcomboxcolumn
,如下所示。它的
SelectionChanged
事件(定义如下)总是会触发两次—一次是在我单击某个项目时触发,另一次是在我从下拉列表中选择新项目时触发。当我单击要更改的项目时,SelectionChanged事件将激发并显示旧值,然后当我选择新值时,它将再次激发并正确显示新值。但是我只希望在为combobox选择新值时触发事件

问题:是什么导致了这种行为以及如何解决该问题

备注:许多在线用户似乎都发布了类似的问题,但他们都没有帮助解决我的问题-也许,这里的上下文有点不同。此外,XAML和代码似乎还可以,因为它正确地显示了combobox值以及网格中每一行的正确combox选择值。此外,SelectionChanged事件不会正确显示新选择的值,但会在第二次触发时显示。显示了类似的代码

是什么导致了这种行为

当您进入编辑模式且
SelectedItem
属性绑定到源属性时,最初会引发
SelectionChanged
事件

如何解决这个问题

处理此问题的最简单方法是检查
组合框
是否已加载,如果未加载,则直接从事件处理程序返回:

private void MyComboBoxColumn_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox comboBox = (ComboBox)sender;
    if (!comboBox.IsLoaded)
        return;

    //handle an actual selection here...
}

使用调试您的事件,您将更好地了解当前正在发生的事情。如果其他用户可能有更好的建议,我将实现它。现在,我通过在获取
comboBox.SelectedValue.ToString()之前使用
if(!comboBox.IsDropDownOpen){return;}
解决了这个问题值。这是因为,默认情况下,组合框的下拉列表是隐藏的(不是打开的),当我第一次单击某个项目时,SelectionChanged(出于某种原因)被调用。但在那个时候,IsDropDownOpen仍然是错误的。然后,下拉列表打开并显示要从中选择项目的项目列表。因此,在第二次执行时,我可以执行所需的
SelectionChanged
代码,即使您建议使用
IsLoaded
与使用
IsDropDownOpen
的工作相同(如我的评论中所建议的)。但是我喜欢你的建议,因为大多数用户对
IsLoaded
属性比
IsDropDownOpen
更熟悉。此外,我喜欢你的回答,因为它更好地解释了错误的原因。谢谢。此解决方案也适用于ListView的类似问题。非常感谢。
private void MyComboBoxColumn_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox comboBox = (ComboBox)sender;
    var selectedVal = comboBox.SelectedValue.ToString();
}
private void MyComboBoxColumn_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox comboBox = (ComboBox)sender;
    if (!comboBox.IsLoaded)
        return;

    //handle an actual selection here...
}