我有一个实体视图模型。由于 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 保存在资源文件中。任何指导将不胜感激。谢谢你。
问候,