2

プラットフォーム: Silverlight 4 / .NET 4

説明:

私は 、ComboBoxTextboxを持ってい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.TextChangedCheckBox.CheckedCheckBox.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 の定義に記載されているように、問題は明らかに TextBox.TextChanged イベントの非同期実行にあります。

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 に答える