【发布时间】: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