我正在创建一个MVVM Wpf客户端应用程序。我想在应用程序的主视图中创建菜单,他的菜单项称为“Window”。该菜单项将通过菜单项子菜单动态更新,菜单项由应用程序中运行的活动窗口列表组成。我创建了一个ViewManager,每个View都注册自己以编译一个活动窗口列表。
我正在尝试在XAML中执行此操作,但在单击“Window”时出现错误
<MenuItem Header="Window">
<ItemsControl ItemsSource="{Binding ViewMgr.Views}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{Binding DataContext.OpenWindowCmd ,
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>
<Setter Property="CommandParameter" Value="{Binding}"/>
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</MenuItem>
如何使用MVVM样式的数据绑定和命令在XAML中的菜单上创建动态更新的菜单项列表?
答案 0 :(得分:1)
您正在添加一个新的ItemsControl作为菜单项的单个子项,而不是将每个视图添加为菜单项本身的一个子项。您可能会收到错误,因为样式TargetType
不匹配。 MenuItem
继承自ItemsControl本身并公开属性ItemsSource
。请尝试以下方法:
<MenuItem ItemsSource="{Binding ViewMgr.Views}" DisplayMemberPath="Title">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{Binding DataContext.OpenWindowCmd, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>
<Setter Property="CommandParameter" Value="{Binding}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>