c# - 如何为 ContextMenu 的 TreeViewItem 设置 DataContext

标签 c# wpf data-binding

我有以下代码。我正在尝试将 MenuItemCommand 属性绑定(bind)到在用户控件的 DataContext 中实现的相关命令。谁能帮我?该命令不会被执行。

<UserControl x:Class="MIB2.App.Presentations.Views.CategoryManView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:model="clr-namespace:MIB2.Models;assembly=MIB2"
             xmlns:local="clr-namespace:MIB2.App.Presentations.Views"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="335">
    <UserControl.Resources>
        <local:DatabindingDebugConverter x:Key="debugConverter" />
    </UserControl.Resources>

    <StackPanel Width="417">
        <TreeView   x:Name="tree"
                    ItemsSource="{Binding RootCategories}" SelectedItemChanged="TreeView_SelectedItemChanged"
                    MouseRightButtonDown="OnPreviewMouseRightButtonDown">
            <TreeView.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Add Root Category" Command="{Binding AddRootCategoryCommand}"/>
                </ContextMenu>
            </TreeView.ContextMenu>
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate   DataType="model:Item"
                                            ItemsSource="{Binding Children}">
                    <Grid>
                        <Grid.ContextMenu>
                            <ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource AncestorType=TextBox}}">
                                <MenuItem Header="Add Category" Command="{Binding Path=AddEntityCommand}" />
                            </ContextMenu>
                        </Grid.ContextMenu>

                        <TextBlock Text="{Binding Description}" Margin="0,0,10,0" Tag="{Binding DataContext, ElementName=tree}"/>
                    </Grid>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
        <StackPanel Orientation="Horizontal">
            <Button Content="Add New Category" Command="{Binding AddEntityCommand}" />
            <Button Content="Add New Root Category" Command="{Binding AddRootCategoryCommand}" />
            <Button Content="Delete Category" Command="{Binding DeleteEntityCommand}" />
        </StackPanel>
        <ContentControl Content="{Binding EntityViewModel.View}" />
    </StackPanel>
</UserControl>

最佳答案

请试试这个:

<TreeView.ItemTemplate>
    <HierarchicalDataTemplate DataType="model:Item"
                              ItemsSource="{Binding Children}">
        <Grid Tag="{Binding DataContext, RelativeSource={RelativeSource AncestorType=UserControl}}">
            <Grid.ContextMenu>
                <ContextMenu>
                    <MenuItem Header="Add Category"
                              Command="{Binding Path=PlacementTarget.Tag.AddEntityCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}" />
                </ContextMenu>
            </Grid.ContextMenu>
            <TextBlock Text="{Binding Description}" Margin="0,0,10,0" />
        </Grid>
    </HierarchicalDataTemplate>
</TreeView.ItemTemplate>

关于c# - 如何为 ContextMenu 的 TreeViewItem 设置 DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11202225/

相关文章:

c# 修改 List<T> 中的结构

c# - 确定两点是否接近

c# - INotifyPropertyChanged 的​​ OnPropertyChanged 参数

c# - 如何在 WPF 中获取以编程方式创建的动态按钮的内容?

silverlight - 将 Silverlight UserControl 绑定(bind)到复杂对象

c# - 当您绑定(bind)到 ItemSsource 时内部会发生什么?

javascript - 如何从 Windows 8/10 WInJS 应用程序在 IE 而不是 Edge 中启动 URL

javascript - 如何解决 Aspx.cs 中文本框的问题

c# - 以样式更改按钮的内容?

wpf - 选择空白行时 DataGrid 上出现意外的红色边框(验证错误)