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

我有一个标准的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() { item.Tag }, null); List 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() { ((TreeViewItem)item.Parent).Tag }, new List() { item.Tag }); List 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; } 

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

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

编辑:

这是我使用的XAML:

         

和代码:

 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

好吧,我发现了我的问题。

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

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

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

一个相关的问题(和答案)在这里: TreeView在用户选择子项后自动选择父项

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