c# - 选择 child 后触发 WPF TreeviewItem 父选择事件?

标签 c# wpf events treeview

我有一个包含多个子项的标准 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/

相关文章:

C# Dapper 在 SQL Server 2016 中使用 JSON_VALUE

c# - 当某些条件为 True 时,对 WPF 中的数据网格单元格进行动画处理?

javascript - event.target 指向一个子元素

Flutter PointerEvent 与 OnTap,一个有效,另一个无效

amazon-web-services - 带有数组列表的 AWS EventBridge 输入转换规则

c# - Unity 5.4 求物体长度

c# - Fancybox 事件未触发

c# - 暂停 Kinect 相机 - SDK 重新保护事件处理程序时可能出错

wpf - 日期字符串格式绑定(bind)不起作用

WPF 使用 DataTemplate 隐式选择模板,但在 'List' 之外