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