60

各タブにフレームが含まれるタブ付きの GUI があります。これらのフレームの 1 つに DataGrid があります。ユーザーがこのタブを選択すると、データグリッドを並べ替える必要があるため、TabControl SelectionChanged イベントを使用して並べ替えをトリガーします。ただし、このイベントは、タブ自体が変更されていない場合でも、DataGrid から項目が選択されるたびにトリガーされます。

私はさまざまなイベントの数を試しました: TabItem の GotFocus、TabItem の RequestBringIntoView

しかし、それらはすべてこの問題に苦しんでいるようです。これは何が原因ですか?

4

4 に答える 4

101

TabControl.SelectionChangedと同じイベントですComboBox.SelectionChanged

に由来しSelector.SelectionChangedます。

そのため、イベント ハンドラーでイベントを処理済みとしてマークしないと、イベントはツリーをバブルアップし、最終的に に到達し、TabControlこの「頻繁に発生する」問題が発生します。

ComboBox/ ListBox/ ListView/DataGrid で使用する他の Selector のSelectionChanged で処理済みとしてイベントをマークします。

private void MyComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    e.Handled = true;
}

そして、この不便さは解消されます;)。

于 2010-09-07T15:07:51.737 に答える
28
     private void tabControlName_SelectionChanged(オブジェクト送信者、SelectionChangedEventArgs e)
        {
            if (e.Source is TabControl) //このイベントが TabControl から発生した場合は、次のように入力します
            {
                if (tabItemName.IsSelected)
                {
                    //ここで仕事をする
                }
            }
        }
于 2011-04-23T12:40:03.900 に答える
3

親要素に AddHandler を使用してハンドラーを追加した場合、すべての選択変更によって SelectionChanged イベントが発生します。この場合、TabControl に名前を付けてから、OriginalSource の名前が TabControl の名前であるかどうかを EventHandler で確認できます。

于 2010-09-07T15:10:43.530 に答える
2

もう1つの適切なアプローチは、tabControl.Items.SelectionChangedにハンドラーを追加することです。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
  ItemCollection view = tabControl.Items;
  view.CurrentChanged += new EventHandler(view_CurrentChanged);
}

void view_CurrentChanged(object sender, EventArgs e)
{
  throw new NotImplementedException();
}

たぶんxamlyの方法ではありませんが、アイテムが変更されたときにのみ発火するため、痛みは少なくなります。

于 2010-11-16T12:44:07.877 に答える