Платформа: 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);
}
Проблема:
В обработчике событий комбобокса я установил текст в текстовом поле ДО , установив состояние проверки флажка. Однако, если вы посмотрите на рисунок ниже, вы увидите, что обработчик событий для CheckBox.Checked
вызывается до TextBox.TextChanged
.
Проблема, очевидно, заключается в асинхронном выполнении события TextBox.TextChanged , как указано в определении MSDN :
Событие TextChanged является асинхронным. Событие не может быть отменено.
Мне действительно нужно, чтобы эти обработчики событий выполнялись точно в том порядке, в котором они изменены.
Вопрос:
Есть ли простой способ добиться того, что мне нужно?