我正在尝试在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。之后,每个类别都包含一个项目列表,这些项目将显示为子菜单。
提前感谢您的帮助。
答案 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
。
您需要在模型中进行一些重命名,或在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; }
...
}
希望此解释可帮助您了解缺少标头值的问题。