c# - 上下文菜单中的命令绑定(bind)

标签 c# wpf contextmenu hierarchicaldatatemplate commandbinding

我有一个 TreeView 并创建了一个基本的 TreeItem 类型。每个 TreeItem 都有一个标题、一个用于子项的 TreeItem 集合和一个可能的上下文菜单集合。 TreeItem 类具有这些对象:

public delegate void dExecute(TreeItem item);

public dExecute ExecuteTarget { get; set; }
public object Tag { get; set; }
public string Header { get; set; }
public List<TreeItem> Children { get; set; }
public List<TreeItem> ContextMenu { get; set; }

上下文菜单再次使用 HierarchicalDataTemplate 来显示 TreeItem 对象(我将 TreeItem 类用于 TreeView 和上下文菜单中的项目)。上下文菜单如下所示:

<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" Visibility="{Binding ShowContextMenu}" ItemsSource="{Binding ContextMenu}">
    <ContextMenu.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Header}"  />
            <HierarchicalDataTemplate.ItemContainerStyle>
                <Style TargetType="MenuItem">
                    <Setter Property="Command" Value="{Binding Execute}"/>
                </Style>
            </HierarchicalDataTemplate.ItemContainerStyle>
        </HierarchicalDataTemplate>
    </ContextMenu.ItemTemplate>
</ContextMenu>

上下文菜单按照我想要的方式呈现。我创建了一个上下文菜单,我只是将其附加到 TreeView 中的一些项目。这是它的内容。

public List<TreeItem> ContextMenu
{
    get
    {
        List<TreeItem> list = new List<TreeItem>();
        TreeItem ti = new TreeItem("Some Action") { ExecuteTarget = targetMethod};
        list.Add(ti);
        ti = new TreeItem("test");
        ti.Children.Add(new TreeItem("foo") { ExecuteTarget = targetMethod});
        ti.Children.Add(new TreeItem("bar") { ExecuteTarget = targetMethod});
        ti.Children.Add(new TreeItem("foo") { ExecuteTarget = targetMethod});
        TreeItem ti2 = new TreeItem("inner"){ ExecuteTarget = targetMethod};
        ti.Children.Add(ti2);
        ti2.Children.Add(new TreeItem("foo") { ExecuteTarget = targetMethod});
        list.Add(ti);
        return list;
    }
}

上下文菜单如下所示。

The rendered context menu

看起来应该是这样。这些命令按预期工作。上下文菜单最高级别的命令除外。当我单击“某些操作”时,没有任何反应。我假设我必须向 XAML 添加一些内容,但我不知道在哪里。

最佳答案

<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" Visibility="{Binding ShowContextMenu}" ItemsSource="{Binding ContextMenu}">
    <ContextMenu.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <TextBlock Text="{Binding Header}"  />
            <HierarchicalDataTemplate.ItemContainerStyle>
                <Style TargetType="MenuItem">
                    <Setter Property="Command" Value="{Binding Execute}"/>
                </Style>
            </HierarchicalDataTemplate.ItemContainerStyle>
        </HierarchicalDataTemplate>
    </ContextMenu.ItemTemplate>

    <!-- this is what you're missing -->
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding Execute}"/>
        </Style>
    </ContextMenu.ItemContainerStyle>
</ContextMenu>

关于c# - 上下文菜单中的命令绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15651143/

相关文章:

c# - 使用 makecert 创建证书吊销列表 (CRL),然后使用 pvk2pfx 将其捆绑到 .pfx

c# - 在线程频繁写的情况下,哪种方式更好?

wpf - 不同大小的WPF表单-设计模式与运行时模式

jQuery 上下文菜单 - 查找触发它的元素

android - 如何覆盖 webview 的文本选择上下文菜单?

javascript - 循环遍历 jQuery 插件选项

c# - UnitOfWork (NHibernate),一次只有一个事件的 UoW/ session ? (需要建议)

c# - msbuild/csproj 执行任务问题

c# - 如何在 wpf c# visual studio 中对标签或文本 block 使用点击事件?

c# - 任务取消暂停 UI