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

本文关键字:菜单 数据绑定 上下文 treeviewitem | 更新日期: 2023-09-27 17:50:25

我有树视图,有两个级别,在第二级我有模板与上下文菜单里面,我试图通过的TreeViewItem的ContextMenu属于作为一个CommandParameter,到目前为止没有成功,在我的应用程序中的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;
    }
}

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

MenuItemTreeViewItem不位于同一视觉树,这就是为什么FindAncestor不能旅行到窗口

你可以使用ContextMenuPlacementTarget来获得TreeViewItem,它将自动继承窗口的DataContext。

你应该这样做:

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