我们使用分层模板填充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://stackoverflow.com/questions/23941314/wpf-how-can-i-create-menu-and-submenus-using-binding?rq=1][1]
在MenuModel中添加的此命令中,我需要在MenuViewmodel中使用Command
答案 0 :(得分:3)
这种约束方式:
{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 Documentation中,只表示理论上可以使用任何类型,但是,FindAncestor
检查可视树以尝试找到给定的祖先,因此您要查找的任何类型必须是存在于视觉树中。希望这会有所帮助。