4

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

请有人解释这个项目是正常的还是我做错了什么以及如何修复它。

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

连接事件处理程序:

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


    }
4

3 回答 3

7

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

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

编辑:

这是我使用的 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 触发。

于 2012-11-13T11:14:44.873 回答
0

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

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

任何人都可以解释这一点,还是只是 Visual Studio 的一个错误?

于 2012-11-13T11:38:27.187 回答
0

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

一个相关的问题(和答案)在这里:TreeView auto-selecting parent after user selects child

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

于 2013-05-09T17:12:30.773 回答