在具有分层数据模板的树视图中绑定上下文菜单命令

Posted

技术标签:

【中文标题】在具有分层数据模板的树视图中绑定上下文菜单命令【英文标题】:Binding contextmenu command in a tree view with hierarchical data template 【发布时间】:2017-02-03 19:18:29 【问题描述】:

我有一个带有分层数据模板的树视图,我正在尝试为 ContextMenu 设置 DataContext,因此我可以将命令绑定到它。我做过研究,知道 ContextMenu 不继承其父级的 DataContext 。我尝试关注这些帖子:How to set the RelativeSource in a DataTemplate that is nested in a HierarchicalDataTemplate?

How to bind to the DataContext of a HierarchicalDataTemplate from its ItemTemplate XAML? 但仍然无法正常工作。任何帮助,将不胜感激。这是我的示例代码:

<TreeView.Resources>  
    <HierarchicalDataTemplate DataType="x:Type viewModels:SiteViewModel" ItemsSource="Binding Children">
        <StackPanel Orientation="Horizontal">
            <StackPanel.Resources>
            </StackPanel.Resources>
            <Image Width="16" Height="16" Margin="3,0"  />
            <TextBlock Text="Binding SiteName" />
        </StackPanel>
    </HierarchicalDataTemplate>


    <HierarchicalDataTemplate DataType="x:Type viewModels:LevelViewModel" ItemsSource="Binding Children" >
        <StackPanel Orientation="Horizontal"  >
            <Image Width="16" Height="16" Margin="3,0"  />
            <TextBlock Text="Binding LevelName"  >
                <TextBlock.ContextMenu >
                <ContextMenu>
                    <MenuItem Header="Test" Command="Binding ?????????" CommandParameter="Binding"/>
                </ContextMenu>
                </TextBlock.ContextMenu>
            </TextBlock>
        </StackPanel>
    </HierarchicalDataTemplate>

【问题讨论】:

【参考方案1】:

一种解决方法: 就我而言,我有类似的情况:

<DataTemplate DataType="...">
                <TreeView>
                    <TreeViewItem Tag="Binding ElementName=LocalControl, Path=DataContext"
                                  Header="Binding ..."
                                  ContextMenu="StaticResource ...">
                        ...
                    </TreeViewItem>
                </TreeView>
</DataTemplate>

您需要将父 TreeViewItem 的 Tag 属性绑定到其 DataContext,然后在上下文菜单的分层模板中的某个位置,您应该将其 DataContext 绑定到父控件的 Tag:

<ContextMenu x:Key="CyclogramFolderContextMenu"
                         DataContext="Binding Path=PlacementTarget.Tag, RelativeSource=RelativeSource Self">
                <TextBlock Text="Do something" >
                    <TextBlock.InputBindings>
                        <MouseBinding Command="Binding Path=(viewModels:someViewModel.SomeCommand)" MouseAction="LeftClick" />
                    </TextBlock.InputBindings>
                </TextBlock>
</ContextMenu>

【讨论】:

以上是关于在具有分层数据模板的树视图中绑定上下文菜单命令的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms 中数据模板视图单元格内的绑定上下文

按需填充上下文菜单

绑定到父数据上下文(超出 itemssource)

WPF 中的变量绑定

WPF 绑定数据模板

如何在gridView中显示某行的上下文菜单