平台: Silverlight 4 / .NET 4
说明
我有ComboBox
,Textbox
和NumericUpDown
。
<StackPanel Margin="10">
<ComboBox SelectionChanged="cmbChanged" Margin="3">
<ComboBoxItem Content="A" />
<ComboBoxItem Content="B" />
</ComboBox>
<TextBox x:Name="txt" TextChanged="txtChanged" Margin="3"/>
<CheckBox x:Name="chk" Checked="chkChecked" Unchecked="chkChecked" Content="Check box" Margin="3"/>
<ListBox x:Name="lst" Height="100" Margin="3"/>
</StackPanel>
列表用于调试目的。
摄制:
请注意,TextBox.TextChanged
,CheckBox.Checked
,CheckBox.Unchecked
和ComboBox.SelectionChanged
都有事件处理程序。
以下是处理程序:
private void cmbChanged(object sender, SelectionChangedEventArgs e)
{
lst.Items.Clear();
txt.Text = (sender as ComboBox).SelectedIndex.ToString();
chk.IsChecked = !chk.IsChecked;
}
private void txtChanged(object sender, TextChangedEventArgs e)
{
lst.Items.Add("Text Changed");
}
private void chkChecked(object sender, RoutedEventArgs e)
{
bool? chk = (sender as CheckBox).IsChecked;
lst.Items.Add("CheckBox Changed to " + chk);
}
问题:
在组合框的事件处理程序中,我在文本框中设置文本 BEFORE 设置复选框的检查状态。但是,如果您查看下面的图片,您会看到CheckBox.Checked
之前调用TextBox.TextChanged
的事件处理程序。
问题显然在于TextBox.TextChanged事件的异步执行,as stated in the MSDN definition:
TextChanged事件是异步的。该活动无法取消。
我真的需要这些事件处理程序完全按照更改它们的顺序执行。
问题: 有没有简单的方法来实现我的需求?
答案 0 :(得分:1)
也许最好直接调用您的业务逻辑,而不是依赖于事件处理程序。您可以随时删除并添加EventHandler,以防您在特定情况下不想触发该触发器:
//Remove event handlers:
CheckBox.Checked -= chkChecked;
TextBox.TextChanged -= txtChanged;
//Call your business stuff here
//You can also 'safely' set values on your textbox and
//checkbox since they wont trigger events now.
//Re-add event handlers, so they react on user input again:
CheckBox.Checked += chkChecked;
TextBox.TextChanged += txtChanged;
答案 1 :(得分:0)
我不是Silverlight的人,所以这些都是建议:
使用KeyDown / KeyUp事件捕获对文本框的更改 使用FocusManager管理同步GotFocus / LostFocus事件并检查其中的更改。