从treeviewitem模板中的上下文菜单中绑定数据

时间:2014-03-16 14:05:16

标签: c# wpf binding command contextmenu

我有两个级别的树视图,在第二级我有模板,里面有一个上下文菜单,我试图传递ContextMenu属于CommandParameter的TreeViewItem,到目前为止没有成功,在我的应用程序中,TreeviewItem有一个HierarchicalDataTemplate,但这里是我的XAML的简化示例:

<Grid
    Background="Transparent">
    <TreeView>
        <TreeViewItem Header="blabla1"/>
        <TreeViewItem Header="blabla2">
            <TreeViewItem Header="innerblalbla">
                <TreeViewItem.ContextMenu>
                    <ContextMenu>
                        <MenuItem Header="Test" 
                                  Command="{Binding PlacementTarget.DataContext.testCommand,
                       RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ContextMenuu}}}"
                                   CommandParameter=??????/>
                    </ContextMenu>
                </TreeViewItem.ContextMenu>
            </TreeViewItem>
        </TreeViewItem>
    </TreeView>
</Grid>

和我的viewModel(DataContext在代码后面设置):

class myViewModel : INotifyPropertyChanged
{

    public myViewModel()
    {
        testCommand = new DelegateCommand(test);
    }

    public DelegateCommand testCommand { get; set; }

    private void test()
    {
        var x = 1;
    }
}

1 个答案:

答案 0 :(得分:2)

MenuItemTreeViewItem 不在同一个视觉树中,这就是为什么FindAncestor无法前往Window。

您可以使用PlacementTarget ContextMenu来获取TreeViewItem,它将自动继承窗口的DataContext。

您就是这样做的:

<MenuItem Header="Test" 
          Command="{Binding PlacementTarget.DataContext.testCommand,
                            RelativeSource={RelativeSource Mode=FindAncestor, 
                                           AncestorType={x:Type ContextMenu}}}"/>