C#WPF上下文菜单数据绑定

时间:2017-10-11 10:08:18

标签: c# wpf contextmenu submenu

我正在尝试在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.

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

首先,您的ContextMenu.ItemTemplate定义不正确,当您为ContextMenu设置ItemSource时,您没有自己定义MenuItem,因为实际上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属性

您需要在模型中进行一些重命名,或在DisplayName模型中引入名为Category的新广告。因此,您的模型将具有类似于此片段中的常见问题:

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

// for submenus
public class Item
{
    public string DisplayName { get; }
    ...
}

希望此解释可帮助您了解缺少标头值的问题。