选择一个孩子后,WPF TreeviewItem父选择事件?

时间:2012-11-13 11:03:17

标签: c# wpf events treeview

我有一个标准的WPF树视图项目,其中包含许多子项。以编程方式创建树时,我将选定的事件处理程序添加到父项和子项。我发现的是,当子项目选择事件被触发并被处理后,然后触发父事件。这个问题是我根据所选项填充数据网格。因此,每次选择子项后,datagrid都会重置为父项选择。

请有人解释这个项目是否正常,或者我是否做错了以及如何解决。

如果您需要更多信息,请与我们联系。

连接事件处理程序:

//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;


    }

3 个答案:

答案 0 :(得分:7)

这必须与你的代码有关。我现在正在使用TreeView,子选择不会触发父选择。你可以发布更多的代码吗?也许我可以发现这个问题。

我的立场得到了纠正。在仔细查看我的代码并运行一些测试之后,这似乎是控件的正常行为。如果您不希望选择冒泡,那么您应该将Handled值设置为true参数的RoutedEventArgs

编辑:

这是我使用的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 触发。

答案 1 :(得分:1)

我发现了我的问题。

当我在子选择事件处理程序中设置断点时,问题才出现。如果没有设置断点,则一切正常,并且数据网格将被填充,就像选择了子项一样。 如果在父选定事件中仅设置了断点,则在选择子项时不会触发断点。 但是,只要在子项中添加断点,就会直接触发父选定处理程序中的断点。

任何人都可以解释这个或者它只是一个错误是Visual Studio吗?

答案 2 :(得分:0)

在点击儿童treenode之后选择父treenode的问题可能有另一个可能的原因: 如果在treeview的选择中更改了事件处理程序,则将Focus更改为除树视图本身之外的其他控件(例如,调用另一个控件的Focus()函数),这将导致树视图在当前事件之后引发另一个选择更改事件,这将将父级设置为已选中。 (为了使调试更加困难,visual studio调用堆栈窗口不会告诉哪个例程触发了此事件。)

相关问题(和答案)在这里:TreeView auto-selecting parent after user selects child

可能不是这个问题的原因,但是发布在这里以防万一有人被这个“奇怪”的问题所驱使(就像我刚刚遭遇的那样)。