我有一个包含多个子项的标准 WPF TreeView 项。以编程方式创建树时,我将选定的事件处理程序添加到父项和子项。我发现的是,当子项目选择事件被触发并被处理后,父事件被触发。这个问题是我根据所选项目填充数据网格。因此,每次选择子项目后,数据网格都会重置为父项目选择。
请有人解释一下这个项目是否正常或者我做错了什么以及如何解决它。
如果您需要更多信息,请告诉我。
连接事件处理程序:
//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;
}
最佳答案
这必须与您的代码有关。我现在正在使用 TreeView,子选择不会触发我的父选择。你能发布更多你的代码吗?也许我可以发现问题。
我是正确的。在仔细查看我的代码并运行一些测试后,这似乎是控件的正常行为。如果您不希望选择冒泡,那么是的,您应该将 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>
还有代码:
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
将在选择子对象时触发。
关于c# - 选择 child 后触发 WPF TreeviewItem 父选择事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13359617/