【问题标题】:WPF ComboBox SelectionChanged event firing twiceWPF ComboBox SelectionChanged 事件触发两次
【发布时间】:2021-03-17 18:19:18
【问题描述】:

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

问题:是什么导致了这种行为,如何解决这个问题?

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

<DataGridComboBoxColumn Header="StartTime" SelectedItemBinding="{Binding localTime}" ItemsSource="{StaticResource localTimeList}">
     <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox">
           <EventSetter Event="SelectionChanged" Handler="MyComboBoxColumn_SelectionChanged"/>
        </Style>
     </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>

活动

private void MyComboBoxColumn_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox comboBox = (ComboBox)sender;
    var selectedVal = comboBox.SelectedValue.ToString();
}

【问题讨论】:

  • 使用 github.com/snoopwpf/snoopwpf 调试您的事件,您将更好地了解当前正在发生的事情。
  • 如果其他用户有更好的建议,我会实施。现在,我在获得comboBox.SelectedValue.ToString(); 值之前使用if (!comboBox.IsDropDownOpen){ return;} 解决了这个问题。这是因为默认情况下,组合框的 DropDown 是隐藏的(未打开),并且当我第一次单击一个项目时,SelectionChanged(出于某种原因)被调用。但当时 IsDropDownOpen 仍然是错误的。之后,下拉菜单打开并显示要从中选择项目的项目列表。因此,第二次我可以执行 SelectionChanged 事件的所需代码

标签: wpf datagrid wpf-controls


【解决方案1】:

是什么导致了这种行为?

SelectionChanged 事件最初在您进入编辑模式并且SelectedItem 属性绑定到您的源属性时引发。

如何解决这个问题?

处理这个问题的最简单方法是检查ComboBox 是否已加载,如果尚未加载,则立即从事件处理程序中返回:

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

    //handle an actual selection here...
}

【讨论】:

  • 您对使用IsLoaded 的建议与使用IsDropDownOpen 的工作相同(正如我的评论中所建议的那样)。但我喜欢你的建议,因为大多数用户比IsDropDownOpen 更熟悉IsLoaded 属性。此外,我喜欢您的回复,因为它更好地解释了导致错误的原因。谢谢。
  • 此解决方案也适用于 ListView 的类似问题。谢谢。
猜你喜欢
  • 2014-03-26
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
相关资源
最近更新 更多