beta-tank
beta-tank

Reputation: 390

Connect handler to ContextMenu in "Style" section

I need to create structure of ContextMenu in runtime, because existence of MenuItem's of the menu is based on many factors. And I try add handler to ContextMenuOpening event this way:

XAML

<TreeView x:Name="ArticlesTreeView" Grid.Column="0" AllowDrop="True">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="ContextMenuService.ShowOnDisabled" Value="True" />
            <Setter Property="ContextMenu">
                <Setter.Value>
                    <ContextMenu Opened="ContextMenu_OnOpened">
                        <MenuItem Header="First item"></MenuItem>
                    </ContextMenu>
                </Setter.Value>
            </Setter>
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

This code throws XamlParseException on <ContextMenu Opened="ContextMenu_OnOpened"> line. Can I solve issue in another way?

UPD I find that to me it is necessary not ContextMenuOpening and Opened event. I corrected upper code.

Upvotes: 0

Views: 748

Answers (2)

Selva
Selva

Reputation: 986

Your question is already answered here.

Placing event handlers in event setter did the work.

<TreeView x:Name="ArticlesTreeView"  AllowDrop="True">
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="ContextMenuService.ShowOnDisabled" Value="True" />
                <Setter Property="ContextMenu">
                    <Setter.Value>
                        <ContextMenu>
                            <MenuItem Header="First item">
                            <MenuItem.Style>
                                <Style TargetType="MenuItem">
                                    <EventSetter Event="Click" Handler="ContextMenu_ContextMenuOpening_1"></EventSetter>
                                </Style>
                            </MenuItem.Style>
                            </MenuItem>
                        </ContextMenu>
                    </Setter.Value>
                </Setter>
            </Style>
        </TreeView.ItemContainerStyle>
        <TreeViewItem>

        </TreeViewItem>
    </TreeView>

Also change your code behind event handler as

  private void ContextMenu_ContextMenuOpening_1(object sender, RoutedEventArgs e)
    {

    }

Upvotes: 1

Krishna
Krishna

Reputation: 1996

Try creating your ContextMenu on your ItemTemplate of the treeview. Try the below code (it is not complete but i hope you get the idea)

<TreeView .....>
<TreeView.ItemTemplate>
<DataTemplate>
<ContentControl>
<ContentControl.ContextMenu>
<ContextMenu ContextMenuOpening="ContextMenu_OnContextMenuOpening">
                        <MenuItem Header="First item"></MenuItem>
                    </ContextMenu>
</ContentControl.ContextMenu>
---------Your Item Template here
</ContentControl>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>

Upvotes: 2

Related Questions