如何同步使Silverlight TextBox.TextChanged事件触发?

时间:2011-07-19 09:40:38

标签: c# silverlight asynchronous textbox textchanged

平台: Silverlight 4 / .NET 4

说明

我有ComboBoxTextboxNumericUpDown

<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.TextChangedCheckBox.CheckedCheckBox.UncheckedComboBox.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 occurs asynchronously

问题显然在于TextBox.TextChanged事件的异步执行,as stated in the MSDN definition

  

TextChanged事件是异步的。该活动无法取消。

我真的需要这些事件处理程序完全按照更改它们的顺序执行。

问题: 有没有简单的方法来实现我的需求?

2 个答案:

答案 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事件并检查其中的更改。