选择子项后触发WPF TreeviewItem父项选择事件? [英] WPF TreeviewItem parent selected event fired after selecting a child?

查看:210
本文介绍了选择子项后触发WPF TreeviewItem父项选择事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有多个子级的标准WPF树视图项.以编程方式创建树时,我将选定的事件处理程序添加到父项和子项.我发现的是,在触发并处理了子项选择事件后,便触发了父项事件.问题是我根据所选项目填充了一个数据网格.因此,每次选择子项之后,数据网格都会重置为父项选择.

I have a standard WPF treeview item with a number of children. When creating the tree programatically I add selected event handlers to the parent and children items. What I am finding is that when after the child items selected event has fired and being handled, the parents event is then fired. The problem with this is that I populate a datagrid based on the selected item. So everytime after selecting a child item the datagrid is reset to the parent item selection.

请有人能解释一下该项目是否正常,或者我做错了什么以及如何修复.

Please could someone explain if this item is normal or if I'd doing something wrong and how to fix it.

如果您需要更多信息,请告诉我.

Please let me know if you require anymore information.

连接事件处理程序:

//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.

I stand corrected. After looking through my code a bit more and running some tests it appears this is normal behavior for the control. If you don't want selections to bubble up then yes you should set the Handled value to true of the RoutedEventArgs parameter.

这是我使用的XAML:

Here's the XAML I used:

<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 .

If the e.Handled = true statement is left commented then Parent_Selected will fire when the child object is selected.

这篇关于选择子项后触发WPF TreeviewItem父项选择事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆