2

平台: 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.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);
}

问题:

在组合框的事件处理程序中,我在设置复选框的选中状态之前设置了文本框中的文本。但是,如果您看一下下面的图片,您会看到CheckBox.Checked之前调用的事件处理程序TextBox.TextChanged

TextBox.TextChanged 异步发生

问题显然在于 TextBox.TextChanged 事件的异步执行,如 MSDN 定义中所述

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

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

问题: 有什么简单的方法可以实现我所需要的吗?

4

2 回答 2

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;
于 2011-07-19T10:52:17.490 回答
0

我不是 Silverlight 的人,所以这些是建议:

使用 KeyDown/KeyUp 事件来捕获对文本框的更改。
使用 FocusManager 管理同步 GotFocus/LostFocus 事件并检查那里的更改。

于 2011-07-19T11:15:31.493 回答