Event at TreeViewItem, work only at root Item

63 views Asked by At

I'm a beginner at WPf, and studying TreeView and TreeViewItem. I want add Event to each TreeViewItem. But the handler's sender is always root item whatever I click rootitem or childItem. this is my code.

            <TreeView>
                <TreeView.ItemContainerStyle>
                    <Style TargetType="TreeViewItem">
                        <EventSetter Event="MouseRightButtonDown" Handler="TreeViewItem_MouseRightButtonDown_2"/>
                    </Style>
                </TreeView.ItemContainerStyle>
                <TreeViewItem Header="1">
                    <TreeViewItem Header="1.1"></TreeViewItem>
                    <TreeViewItem Header="1.2"></TreeViewItem>
                    <TreeViewItem Header="1.3"></TreeViewItem>
                    <TreeViewItem Header="1.4"></TreeViewItem>
                </TreeViewItem>
                <TreeViewItem Header="2">
                    <TreeViewItem Header="2.2"></TreeViewItem>
                </TreeViewItem>
                <TreeViewItem Header="3">
                    <TreeViewItem Header="2.2"></TreeViewItem>
                </TreeViewItem>
                <TreeViewItem Header="4">
                    <TreeViewItem Header="2.2"></TreeViewItem>
                </TreeViewItem>
            </TreeView>

and this is handler

private void TreeViewItem_MouseRightButtonDown_2(object sender, MouseButtonEventArgs e)
        {
            TreeViewItem t = sender as TreeViewItem;
            MessageBox.Show(t.Header.ToString());
        }

The messageBox always show 1, 2, 3 ... not 1.1, 1.2, 2.1... I want to get the item exactly clicked, How can I do? Thank you!

1

There are 1 answers

0
Rekshino On

You have to set implicit style for all tree view items, ItemContainerStyle being applied to the top level/root items:

<TreeView>
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <EventSetter Event="MouseRightButtonDown" Handler="TreeViewItem_MouseRightButtonDown_2"/>
        </Style>
    </TreeView.Resources>
    <TreeViewItem Header="1">
        <TreeViewItem Header="1.1"></TreeViewItem>
        <TreeViewItem Header="1.2"></TreeViewItem>
        <TreeViewItem Header="1.3"></TreeViewItem>
        <TreeViewItem Header="1.4"></TreeViewItem>
    </TreeViewItem>
    <TreeViewItem Header="2">
        <TreeViewItem Header="2.2"></TreeViewItem>
    </TreeViewItem>
    <TreeViewItem Header="3">
        <TreeViewItem Header="2.2"></TreeViewItem>
    </TreeViewItem>
    <TreeViewItem Header="4">
        <TreeViewItem Header="2.2"></TreeViewItem>
    </TreeViewItem>
</TreeView>

and also prevent the event bubbles up with e.Handled = true;

private void TreeViewItem_MouseRightButtonDown_2(object sender, MouseButtonEventArgs e)
{
    TreeViewItem t = sender as TreeViewItem;
    MessageBox.Show(t.Header.ToString());

    e.Handled = true;
}