绑定菜单项命令到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,则不会调用该命令。我错过什么了吗?

绑定菜单项命令到UserControls DataContext

这是因为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}"