4

多数の子を持つ標準の WPF ツリービュー アイテムがあります。プログラムでツリーを作成するときは、選択したイベント ハンドラーを親アイテムと子アイテムに追加します。私が見つけたのは、子アイテムの選択されたイベントが発生して処理された後、親イベントが発生することです。これの問題は、選択したアイテムに基づいてデータグリッドを作成することです。したがって、子アイテムを選択した後は常に、データグリッドは親アイテムの選択にリセットされます。

このアイテムが正常なのか、それとも私が何か間違ったことをしているのか、そしてそれを修正する方法を誰かが説明してください.

さらに情報が必要な場合はお知らせください。

イベント ハンドラーの接続:

//parent
TreeViewItem tvi = new TreeViewItem();

                    tvi.Header = str;

                    tvi.Selected += CoreSupplierSelected

//child
TreeViewItem tvi = new TreeViewItem();
                            tvi.Header = str;
                            tvi.Tag = resinSystems.Values[i];
                            tvi.Selected += CoreResinSystemSelected;

ハンドラー:

private void CoreSupplierSelected(object sender, RoutedEventArgs e)
    {
        TreeViewItem item = e.OriginalSource as TreeViewItem;
        MaterialSelectionData thicknessData = editInterface.GetCoreThicknessData(new List<object>() { item.Tag }, null);
        List<string> columnNames = thicknessData.DisplayFieldTitles;
        columnNames.Insert(0,"");
        DataTable dt = GUICommon.DatableConverter.ToDataTable(thicknessData.DisplayData, columnNames);
        dtgCores.ItemsSource = dt.AsDataView();
        dtgCores.Columns[0].Visibility = System.Windows.Visibility.Collapsed;
    }

    private void CoreResinSystemSelected(object sender, RoutedEventArgs e)
    {

        TreeViewItem item = e.OriginalSource as TreeViewItem;
        GX3MaterialSelectionData thicknessData = editInterface.GetCoreThicknessData(new List<object>() { ((TreeViewItem)item.Parent).Tag }, new List<object>() { item.Tag });
        List<string> columnNames = thicknessData.DisplayFieldTitles;
        columnNames.Insert(0, "");
        DataTable dt = GUICommon.DatableConverter.ToDataTable(thicknessData.DisplayData, columnNames);
        dtgCores.ItemsSource = dt.AsDataView();
        e.Handled = true;
        dtgCores.Columns[0].Visibility = System.Windows.Visibility.Collapsed;


    }
4

3 に答える 3

7

これはあなたのコードにあるものでなければなりません。現在 TreeView を使用していますが、子の選択によって親の選択がトリガーされません。あなたのコードをもっと投稿できますか?おそらく私は問題を見つけることができます。

私は訂正します。コードをもう少し調べていくつかのテストを実行すると、これはコントロールの通常の動作であることがわかります。選択をバブルアップさせたくない場合は、はい、パラメータのHandled値を設定する必要があります。trueRoutedEventArgs

編集:

使用した XAML は次のとおりです。

<TreeView Width="200" Height="300">
    <TreeViewItem Header="Parent" Selected="Parent_Selected">
        <TreeViewItem Header="Child" Selected="Child_Selected" />
    </TreeViewItem>
    <TreeViewItem Header="Parent" Selected="Parent_Selected">
        <TreeViewItem Header="Child" Selected="Child_Selected" />
    </TreeViewItem>
</TreeView>

そしてコード:

private void Parent_Selected(object sender, RoutedEventArgs e)
{
    bool test = false;
}

private void Child_Selected(object sender, RoutedEventArgs e)
{
    bool test = false;
    // e.Handled = true;
}

e.Handled = trueステートメントをコメントのままにしておくParent_Selected 、子オブジェクトが選択されたときに実行されます。

于 2012-11-13T11:14:44.873 に答える
0

さて、私は自分の問題を見つけました。

この問題は、子が選択したイベントハンドラーにブレークポイントが設定されている場合にのみ発生します。ブレークポイントが設定されていない場合、すべてが正常に機能し、子アイテムが選択されたかのようにデータグリッドにデータが入力されます。親が選択したイベントにブレークポイントのみが設定されている場合、子を選択するときにブレークポイントは発生しません。しかし、子アイテムにブレークポイントを追加するとすぐに、親が選択したハンドラーのブレークポイントがすぐに発生します。

誰かがこれを説明できますか、それとも単なるバグがVisual Studioですか?

于 2012-11-13T11:38:27.187 に答える
0

子ツリー ノードをクリックした後に親ツリー ノードが選択される問題には、別の理由が考えられます。 )、ツリービューは現在のイベントの後に別の選択変更イベントを発生させ、親を選択済みとして設定します。(デバッグをさらに難しくするために、ビジュアル スタジオのコール スタック ウィンドウは、このイベントをトリガーしたルーチンを通知しません。)

関連する質問 (および回答) は次のとおりです: TreeView auto-selectingparent after user selected child

この質問の理由ではないかもしれませんが、誰かがこの「奇妙な」問題に夢中になった場合に備えてここに投稿しました (私が今苦しんだようなものです)。

于 2013-05-09T17:12:30.773 に答える