我想使用DataTemplate根据MVVM来从我的ViewModels创建菜单。基本上,我已经创建了几个类,将存储有关我的菜单结构的信息。然后,我想使用DataTemplate将该菜单结构实现为WPF菜单。
我有一个菜单服务,允许不同的组件注册新菜单和菜单项。以下是我的菜单信息(ViewModel)的组织方式:
我有以下类: MainMenuViewModel - 包含TopLevelMenuViewModelCollection(顶级菜单的集合)
TopLevelMenuViewModel - 包含MenuItemGroupViewModelCollection(菜单项组的集合)和菜单“文本”的名称
MenuItemGroupViewModel - 包含MenuItemViewModelCollection(菜单项的集合)
MenuItemViewModel - 包含文本、图像uri、命令和子项MenuItemViewModels
我想做的是将DataTemplate应用于之前的类,以将它们转换为普通菜单。
MainMenuViewModel -> Menu
TopLevelMenuViewModel -> 具有标题设置的菜单项
MenuItemGroupViewModel -> Separator,后跟每个MenuItemViewModel的MenuItem
MenuItemViewModel -> MenuItem(HeirarchicalDataTemplate)
问题在于我不知道如何为MenuItemGroupViewModel生成多个MenuItem。菜单模板希望始终为每个项目创建一个ItemContainer,而这个项目是一个MenuItem。因此,我要么最终使我的菜单项在一个MenuItem内,这显然是行不通的,要么就完全无法使用。我尝试了几种方法,仍然无法弄清如何使单个项目产生多个菜单项。
我有一个菜单服务,允许不同的组件注册新菜单和菜单项。以下是我的菜单信息(ViewModel)的组织方式:
我有以下类: MainMenuViewModel - 包含TopLevelMenuViewModelCollection(顶级菜单的集合)
TopLevelMenuViewModel - 包含MenuItemGroupViewModelCollection(菜单项组的集合)和菜单“文本”的名称
MenuItemGroupViewModel - 包含MenuItemViewModelCollection(菜单项的集合)
MenuItemViewModel - 包含文本、图像uri、命令和子项MenuItemViewModels
我想做的是将DataTemplate应用于之前的类,以将它们转换为普通菜单。
MainMenuViewModel -> Menu
TopLevelMenuViewModel -> 具有标题设置的菜单项
MenuItemGroupViewModel -> Separator,后跟每个MenuItemViewModel的MenuItem
MenuItemViewModel -> MenuItem(HeirarchicalDataTemplate)
问题在于我不知道如何为MenuItemGroupViewModel生成多个MenuItem。菜单模板希望始终为每个项目创建一个ItemContainer,而这个项目是一个MenuItem。因此,我要么最终使我的菜单项在一个MenuItem内,这显然是行不通的,要么就完全无法使用。我尝试了几种方法,仍然无法弄清如何使单个项目产生多个菜单项。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:--">
<!-- These data templates provide the views for the menu -->
<!-- MenuItemGroupView -->
<Style x:Key="MenuItemGroupStyle" TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="qqq" />
<!-- Now what? I don't want 1 item here..
I wanted this to start with a <separator /> and list the MenuItemGroupViewModel.MenuItems -->
</Style>
<!-- TopLevelMenuView -->
<Style x:Key="TopLevelMenuStyle" TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="{Binding Text}" />
<Setter Property="ItemsSource" Value="{Binding MenuGroups}" />
<Setter Property="ItemContainerStyle" Value="{StaticResource MenuItemGroupStyle}"/>
</Style>
<!-- MainMenuView -->
<DataTemplate DataType="{x:Type local:MainMenuViewModel}">
<Menu ItemsSource="{Binding TopLevelMenus}" ItemContainerStyle="{StaticResource TopLevelMenuStyle}" />
</DataTemplate>
<!-- MenuItemView -->
<!--<HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}"
ItemsSource="{Binding Path=Children}"
>
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command"
Value="{Binding Command}" />
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding ImageSource}" />
<TextBlock Text="{Binding Text}" />
</StackPanel>
</HierarchicalDataTemplate>-->
请点击以下链接查看我尝试做的更好的图片
TopLevel.MenuGroups
并说:“好的,让我们为每个组创建一个菜单项。”当我第一次开始使用WPF和MVVM时,我也多次遇到“数据分离”的问题。但是,复杂性必须存在于某个地方,无论您是在转换器中使用数据还是其他方式。 - Jake Berger