在具有分层数据模板的树视图中绑定contextmenu命令

本文关键字:视图 绑定 命令 contextmenu 分层 数据 | 更新日期: 2023-09-27 18:08:55

我有一个具有分层数据模板的树视图,我试图为ContextMenu设置DataContext,因此我可以将命令绑定到它。我已经做了研究,知道ContextMenu不继承其父的DataContext。我试图遵循这些帖子:如何设置RelativeSource在一个数据模板是嵌套在一个HierarchicalDataTemplate?

如何从其ItemTemplate XAML绑定到一个HierarchicalDataTemplate的DataContext ?但还是不能让它工作。任何帮助都会很感激。下面是我的示例代码:

<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>

在具有分层数据模板的树视图中绑定contextmenu命令

解决方法之一:在我的例子中是这样的:

<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>