将MenuItems命令绑定到UserControls DataContext

时间:2016-09-21 11:41:45

标签: c# wpf xaml mvvm data-binding

我有以下布局:

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。有什么我想念的吗?

1 个答案:

答案 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}"