绑定菜单项命令到UserControls DataContext
本文关键字:UserControls DataContext 命令 菜单项 绑定 | 更新日期: 2023-09-27 18:07:59
我有以下布局:
public class ParentUserControl : UserControl{...}
<ParentNameSpace:ParentUserControl
...
DataContext={Binding MyViewModel ....}
>
<TreeView ...>
<HierarchicalDataTemplate
.... >
<StackPanel>
<StackPanel.ContextMenu>
<ContextMenu>
<MenuItem Header="item"
Command="{Binding DataContext.SomeCommandInMyViewModel,
RelativeSource={RelativeSource
AncestorType={x:Type ParentUserControl}}}"/>
</ContextMenu>
</StackPanel.ContextMenu>
<TextBlock Text="{Binding Path=Name}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView>
我试图从TreeViewItem的上下文中调用UserControls ViewModel的命令,但没有成功。它告诉我在wpf项目中不支持ParentUserControl。如果我将祖先类型更改为UserControl,则不会调用该命令。我错过什么了吗?
这是因为ContextMenu
不是可视树的一部分。不改变代码隐藏的最简单方法是:
给ParentUserControl
命名:
<ParentNameSpace:ParentUserControl x:Name="ParentRoot" ... >
使用此绑定:
Command="{Binding Source={x:Reference Name=ParentRoot}, Path=DataContext.SomeCommandInMyViewModel}"
更新不使用x:Name
属性。
您可以使用ContextMenu.PlacementTarget
属性,在您的情况下它将指向StackPanel
。然后你可以使用它的Tag
属性来访问你的视图模型。
<StackPanel Tag="{Binding RelativeSource={RelativeSource AncestorType=ParentNameSpace:ParentUserControl}, Path=DataContext}">
和命令:
Command="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.Tag.SomeCommandInMyViewModel}"