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 将枚举数据绑定到组合框? [复制]