在ComboBox.SelectionChanged事件中,我想知道谁更改了ComboBox值,用户或其他一些代码。
首先我检查了cmbBox.IsDropDownOpen是否为true。但如果用户使用键盘更改了ComboBox,则这是错误的。
然后我想检查它是否专注。 Silverlight ComboBox没有IsFocused属性,因此我将状态保存在cmbBoxGotFocus和cmbBoxLostFocus事件处理程序中:
private bool cmbBox_isFocused = false;
private void cmbBox_GotFocus(object sender, RoutedEventArgs e)
{
cmbSalesPerson_isFocused = true;
}
private void cmbBox_LostFocus(object sender, RoutedEventArgs e)
{
cmbSalesPerson_isFocused = false;
}
不幸的是,这不起作用,因为我有一些奇怪的行为,我不明白:当用户点击ComboBox时,两个事件一个接一个地被触发,所以bool仍然是假的。
答案 0 :(得分:3)
如果您正在使用Model-View-ViewModel pattern(这是WPF和Silverlight应用程序的事实标准,并且有充分理由),那么这应该是微不足道的:当组合框的值发生更改时,Silverlight将设置您自己的ViewModel属性。您可以在属性设置器中放置逻辑,以响应您需要的更改。
答案 1 :(得分:1)
您是否尝试使用xxxCombo_DropDownClosed
事件?
答案 2 :(得分:1)
用于在ComboBox
值中确定的相应事件已更改为SelectionChanged
事件。但是,当ItemsSource
被分配时,此事件也会触发,因此它不是用户更改的绝对指南,但它非常接近。
一种方法是在用户控件加载事件中或在您知道已分配SelectionChanged
的其他位置为ItemsSource
分配事件处理程序。
答案 3 :(得分:0)
我想我没有说清楚问题:我想区分用户和代码。我希望我在最后一次编辑中澄清这一点。
我想没有简单的方法可以做到这一点。我的解决方案是从更改ComboBox值的代码中设置一些标志。这很简单,因为它是我的代码:)。