Привязка уровня предка не работает в команде 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
проверяет визуальное дерево, чтобы попытаться найти заданного предка, поэтому любой тип искомого типа должен присутствовать в визуальном дереве. Надеюсь это поможет.