Привязка уровня предка не работает в команде MenuItem

Мы должны использовать иерархический шаблон для заполнения пункта меню

<UserControl.DataContext>
        <local:MenuViewModel/>
    </UserControl.DataContext>    

    <Grid>
        <!--Initialize the Menu-->
        <Menu Name="Part_Menu" ItemsSource="{Binding MenuCollection}" Background="#E5E5E5" VerticalAlignment="Center">
            <Menu.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding MenuItemCollection}">
                    <TextBlock  Text="{Binding Header}" />
                    <HierarchicalDataTemplate.ItemContainerStyle>
                        <Style TargetType="MenuItem">
                            <Setter Property="CommandParameter"  Value="{Binding Header}"/>
                            <Setter Property="VerticalAlignment" Value="Center"/>
                            <Setter Property="Command"
                                    Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MenuViewModel}, AncestorLevel=2,Mode=FindAncestor},Path=MenuClick}"></Setter>
                        </Style>
                    </HierarchicalDataTemplate.ItemContainerStyle>                    
                </HierarchicalDataTemplate>
            </Menu.ItemTemplate>
        </Menu>
    </Grid>

В этом я попытался привязать MenuClick(ICommand) к MenuItem, но он не был привязан правильно

Я должен проверить привязку в следующей ссылке на форуме

[http://stackru.com/questions/23941314/wpf-how-can-i-create-menu-and-submenus-using-binding?rq=1][1]

В этой команде, добавленной в MenuModel, мне нужно командовать в MenuViewmodel

1 ответ

Этот способ связывания:

{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MenuViewModel},     
                                        AncestorLevel=2, Mode=FindAncestor} 

..не работает, потому что AncestorType не вытекает из UIElement,

Путь связывания должен быть DataContext.MenuClickи AncestorType должно быть Menu, Собираем все вместе:

<Setter Property="Command" 
        Value="{Binding Path=DataContext.MenuClick, 
                        RelativeSource={RelativeSource AncestorType={x:Type Menu},
                                                       AncestorLevel=2}}">
</Setter>

Mode=FindAncestor это режим по умолчанию, поэтому я оставил это.

В документации MSDN: RelativeSource.AncestorType указано, что теоретически может быть использован любой тип, однако FindAncestor проверяет визуальное дерево, чтобы попытаться найти заданного предка, поэтому любой тип искомого типа должен присутствовать в визуальном дереве. Надеюсь это поможет.

Другие вопросы по тегам