C# WPF TreeviewItem父级选择事件在选择子级后激发?

C# WPF TreeviewItem父级选择事件在选择子级后激发?,c#,wpf,events,treeview,C#,Wpf,Events,Treeview,我有一个标准的WPF treeview项目和一些孩子。以编程方式创建树时,我将选定的事件处理程序添加到父项和子项中。我发现,在启动并处理子items selected事件之后,将启动parents事件。问题是我基于所选项目填充了一个datagrid。因此,每次选择子项后,datagrid都会重置为父项选择 请有人解释一下,如果这个项目是正常的,如果我做错了什么,以及如何修复它 如果您需要更多信息,请告诉我 连接事件处理程序: //parent TreeViewItem tvi = new Tre

我有一个标准的WPF treeview项目和一些孩子。以编程方式创建树时,我将选定的事件处理程序添加到父项和子项中。我发现,在启动并处理子items selected事件之后,将启动parents事件。问题是我基于所选项目填充了一个datagrid。因此,每次选择子项后,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;


    }
private void核心供应商已选定(对象发送方、路由目标方)
{
TreeViewItem项=e.作为TreeViewItem的原始源;
MaterialSelectionData thicknessData=editInterface.GetCoreThecknessData(新列表(){item.Tag},null);
列表columnNames=thicknessData.DisplayFieldTitles;
columnNames。插入(0,“”);
DataTable dt=GUICommon.dataleconverter.ToDataTable(thicknessData.DisplayData,columnNames);
dtgCores.ItemsSource=dt.AsDataView();
dtgCores.Columns[0]。可见性=System.Windows.Visibility.columpled;
}
private void CoreResinSystemSelected(对象发送方,RoutedEventArgs e)
{
TreeViewItem项=e.作为TreeViewItem的原始源;
GX3MaterialSelectionData thicknessData=editInterface.GetCoreThicknessData(新列表(){((TreeViewItem)item.Parent).Tag},新列表(){item.Tag});
列表columnNames=thicknessData.DisplayFieldTitles;
columnNames。插入(0,“”);
DataTable dt=GUICommon.dataleconverter.ToDataTable(thicknessData.DisplayData,columnNames);
dtgCores.ItemsSource=dt.AsDataView();
e、 已处理=正确;
dtgCores.Columns[0]。可见性=System.Windows.Visibility.columpled;
}
这必须与您的代码有关。我现在正在使用树状视图,子选择不会触发父选择。你能发布更多的代码吗?也许我能发现这个问题

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

编辑:

以下是我使用的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>

如果对
e.Handled=true
语句进行了左注释,则选中子对象时将触发
Parent\u Selected

我发现了我的问题

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


有人能解释这一点吗?或者这只是Visual Studio的一个bug?

单击子树节点后选择父树节点的问题可能有另一个原因: 如果在treeview的selection changed事件处理程序中,焦点被更改到treeview本身以外的其他控件上(例如,调用另一个控件的Focus()函数),它将导致treeview在当前事件之后引发另一个selection changed事件,这将设置parent为selected。(为了使调试更加困难,visual studio调用堆栈窗口不会告诉是哪个例程触发了此事件。)

相关问题(和答案)如下:


可能不是这个问题的原因,但如果有人被这个“奇怪”的问题(比如我刚才遇到的问题)逼疯了,请发到这里。

这与事件冒泡有关吗?我将尝试设置e.handled=true;在所选的子Handler中,我在事件处理程序中添加了代码。我真不明白它为什么要这样做。它在单步执行子选择的事件后,窗口再次弹出几秒钟,然后进入父选择的事件。我尝试了e.handled,但它仍然触发父事件处理程序:(似乎在父处理器中提出了一个新的RoutedEventArgs,handled=false。嗯,这部分是个问题。你能发布你用来填充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;
}