我有一个实体视图模型。由于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)属性。可能有许多节点,因此在加载时存储所有节点的上下文菜单项可能是一个巨大的内存问题。我希望当用户右键单击实体(模板)时,会填充视图模型的ContextOperations
属性,然后呈现上下文菜单。此数据模板保存在资源文件中。如有任何指导,我们将不胜感激。非常感谢。
问候,
处理数据模板边界上的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中删除上下文菜单的定义。