【问题标题】:C# WPF Context Menu Data BindingC# WPF 上下文菜单数据绑定
【发布时间】:2018-03-22 23:10:28
【问题描述】:

我正在尝试在 WPF DataGrid 中创建一个动态上下文菜单。以下是我需要帮助的问题:

1) 根菜单项标题未与 ViewModel 绑定,而子菜单工作正常。

2) 子菜单总是在左侧而不是右侧弹出。如何用样式解决这个问题?

<DataGrid.ContextMenu>
<ContextMenu ItemsSource="{Binding PackageCM.Members}" HasDropShadow="True" Placement="Right">
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Header" Value="{Binding CategoryName}" />
        </Style>
    </ContextMenu.ItemContainerStyle>
    <ContextMenu.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Items}">
            <MenuItem Header="{Binding DisplayName}" Command="{Binding AllPackagesVM.OpenCOBAPackageCommand, Source={StaticResource Locator}}"></MenuItem>
        </HierarchicalDataTemplate>
    </ContextMenu.ItemTemplate>
</ContextMenu>

Root Menu Item Header are not being bind.

基本上,上下文菜单绑定到具有类别对象列表的 PackageCM.Members,我想在上下文菜单根目录上显示 CategoryName。之后,每个类别都包含一个项目列表,这些项目将显示为子菜单。

提前感谢您的帮助。

【问题讨论】:

    标签: c# wpf contextmenu submenu


    【解决方案1】:

    首先,您的ContextMenu.ItemTemplate 定义不正确,当您为 ContextMenu 设置 ItemSource 时,您没有自己定义 MenuItems,因为实际上 ContextMenu 会将此内容包装在另一个 MenuItem 中。所以你需要把你的模板改成这样:

    <ContextMenu ItemsSource="{Binding PackageCM.Members}" ...>
        <ContextMenu.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Items}">
                <TextBlock Text="{Binding DisplayName}"></TextBlock >
            </HierarchicalDataTemplate>
        </ContextMenu.ItemTemplate>
    </ContextMenu>
    

    您需要放置TextBlock 而不是MenuItem,因为您想在ContextMenu 菜单中显示文本并将其Text 属性绑定到模型中的属性。但是这样才能正常工作,用于根菜单的模型和用于子菜单的模型必须具有一个名称相同的属性,在您的情况下,子菜单是DisplayName,因此在您的根菜单模型中还必须有一个名为DisplayName 的属性,该属性绑定到TextBlock 的Text 属性。

    您需要在模型中进行一些重命名,或者在 Category 模型中引入一个名为 DisplayName 的新属性。因此,您的模型将具有类似于此 sn-p 的共同属性:

    // for root menu
    public class Category
    {
        public string CategoryName { get; }
        public string DisplayName => CategoryName;
        ...
    }
    
    // for submenus
    public class Item
    {
        public string DisplayName { get; }
        ...
    }
    

    希望这个解释可以帮助您理解缺少标头值的问题。

    【讨论】:

    • 非常感谢,Redouane。它工作得很好,现在我可以看到 ContextMenu 正确显示。此外,现在我了解了 ContextMenu 如何与子菜单一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多