XAML 组合框 SelectionChanged 触发 OnLoad

Posted

技术标签:

【中文标题】XAML 组合框 SelectionChanged 触发 OnLoad【英文标题】:XAML ComboBox SelectionChanged Fires OnLoad 【发布时间】:2010-05-04 00:17:22 【问题描述】:

如果我有一个具有 SelectionChanged 事件的 ComboBox,它会在我加载控件时触发。

所以在页面加载时,我设置了 SelectedValue 并触发了 SelectionChanged 事件,这不是我想要发生的。

阻止这种情况的公认方法是什么?

【问题讨论】:

【参考方案1】:

两个明显的解决方案是 1) 等到包含 ComboBox 的 Window/Page/UserControl 的 Loaded 事件并在那里连接 SelectionChanged...例如在构造函数中:

// set the inital selected index for the combo box here...

this.Loaded += (s, args) =>
               
                    cmbBox.SelectionChanged += 
                            new SelectionChangedEventHandler(HandleChanged);
               ;

或 2) 在执行任何操作之前检查 ComboBox 是否已加载到选择更改的处理程序中,如果没有则返回...例如在处理程序中:

if (!cmbBox.IsLoaded)
        return;

我更喜欢数字 1,因为它不需要每次触发 SelectionChanged 处理程序时都进行检查。

【讨论】:

@SANDEEP 正如我提到的,把它放在构造函数中(包含有问题的控件的视图) 解决方案的第二部分不起作用。在初始化期间,选择被更改并触发事件。在事件处理程序内部,IsLoaded 为 true 我的解决方案(除上述之外)是在构造函数中而不是在窗口的加载事件处理程序中设置 DataContext【参考方案2】:

我遇到了一个特殊的情况:

如果您正在使用枢轴,并且过早触发控制在 PivotItem > 0 中,您仍然会遇到问题。

在这种情况下,this.Loaded() 似乎只引用 PivotItem“0”,并且在 UI 中更改为其他 PivotItem 无论如何都会触发事件。

在这种情况下,解决方案是(以您的示例):

cmbBox.Loaded += (s, args) =>
           
                cmbBox.SelectionChanged += 
                        new SelectionChangedEventHandler(HandleChanged);
           ;

【讨论】:

以上是关于XAML 组合框 SelectionChanged 触发 OnLoad的主要内容,如果未能解决你的问题,请参考以下文章

Windows Phone 8 中的 Pivot selectionChanged 事件和单击处理程序

选择组合框时设置文本框的属性 WPF XAML

XAML:在组合框项目突出显示上显示按钮

WPF 数据绑定:如何使用 XAML 将枚举数据绑定到组合框? [复制]

无法在组合框c#(和xaml)中执行selectedIndexChanged

在wpf中访问数据网格内的组合框属性