1

我有一个实体视图模型。由于 UI 中可能有许多实体,因此我使用了 DataTemplate 来表示实体视图模型。容器控件的 ItemTemplate 属性使用此数据模板来呈现实体。请注意,这不是传统的 ListView/ListBox 控件。它是一个图形控件,其边和节点由数据模板表示。这就是说,每个节点都是不同的类型,当用户右键单击时,模板的上下文菜单将绑定到视图模型提供的集合。以下代码工作正常:

<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填充视图模型的属性,然后呈现上下文菜单。此 DataTemplate 保存在资源文件中。任何指导将不胜感激。谢谢你。

问候,

4

1 回答 1

1

处理数据模板边框上的 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 的定义。

于 2012-10-03T13:21:42.780 回答