我有一个实体视图模型。由于UI中可以有许多实体,我使用DataTemplate来表示实体视图模型。容器控件的ItemTemplate属性使用此数据模板来呈现实体。 请注意,这不是传统的ListView / ListBox控件。它是一个Graph控件,边缘和节点由数据模板表示。 这就是说,每个节点都是不同类型的,当用户右键单击时,模板的上下文菜单被绑定到视图模型提供的集合。以下代码工作正常:
<DataTemplate DataType="{x:Type model:Person}">
<Border Style="{StaticResource NodeBorderStyle}" MinWidth="200">
<Border.ContextMenu>
<ContextMenu ItemsSource="{Binding ContextOperations}">
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{Binding PlacementTarget.DataContext.HandleContextOperationCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"/>
<Setter Property="CommandParameter" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Header}"/>
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
</Border.ContextMenu>
....................
</Border >
</DataTemplate>
这有一个限制,当视图模型初始化时,必须填充ContextOperations
(一个ObservableCollection)属性。
可能存在许多节点,因此在加载时为所有节点存储上下文菜单项可能是巨大的存储器问题。
我希望当用户右键单击实体(模板)时,将填充viewmodel的ContextOperations
属性,然后呈现上下文菜单。
此DataTemplate保存在资源文件中。
任何指导将不胜感激。
谢谢。
的问候,
答案 0 :(得分:1)
在datatemplate边框上处理MouseRightButtonUp事件并创建上下文菜单运行时,如下所示:
private void borderMouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
OpenContextMenu(sender as ComboBox);
}
private void OpenContextMenu(FrameworkElement element)
{
if (element.ContextMenu == null)
{
ContextMenu c = new ContextMenu();
//Load the ContextOperations from ViewModel
//based on the Framework element datacontext
ContextOperations.ToList().ForEach(co => c.Items.Add(new MenuItem()
{
//Create your menu item
}));
element.ContextMenu = c;
}
element.ContextMenu.PlacementTarget = element;
element.ContextMenu.IsOpen = true;
}
并从XAML中删除contextmenu的定义。