XAML ComboBox在加载时会触发SelectionChanged事件。

9
如果我有一个ComboBox并且它有一个SelectionChanged事件,当我加载控件时它会触发。
因此,在页面加载时我设置了SelectedValue,SelectionChanged事件就会触发,这不是我想要的结果。
有什么可行的方法可以阻止这种情况发生?
2个回答

19

有两种明显的解决方案,一种是等待包含组合框的窗口/页面/用户控件的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 如我所提到的,在构造函数中放置它(在包含相关控件的视图中)。 - Simon Fox
解决方案的第二部分不起作用。在初始化期间,选择被更改并触发了事件。在事件处理程序内部,IsLoaded为true。 - Kesty
对我而言(除了上述方法),解决方案是在构造函数中设置DataContext,而不是在窗口的Loaded事件处理程序中设置。 - Kesty

1
我遇到了一个特殊情况:
如果您正在使用数据透视表,并且过早地触发控件位于PivotItem > 0中,则仍然会出现问题。
在这种情况下,似乎this.Loaded()仅涉及PivotItem“0”,而在UI中更改到其他PivotItem将无论如何触发事件。
在这种情况下,解决方案是(以您的示例为例):
cmbBox.Loaded += (s, args) =>
           {
                cmbBox.SelectionChanged += 
                        new SelectionChangedEventHandler(HandleChanged);
           };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接