我有以下布局:
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的Context中调用UserControls ViewModel的命令但没有成功。它告诉我在wpf项目中不支持ParentUserControl。如果我将AncestorType更改为UserControl,则不会调用Command。有什么我想念的吗?
答案 0 :(得分:0)
这是因为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}"