我正在学习WPF并开发一个动态菜单,该菜单由它的ItemsSource与ObservableCollection
的数据绑定驱动。为此,我有一个简单的MenuItemViewModel
和一个HierarchicalDataTemplate
,用于自动将MenuItem绑定到它。
我遇到的问题是Command
属性不适用于顶级菜单项。尽管已设置,但MenuItem对鼠标单击没有反应,如果无法执行Command,则不会被禁用。简直就是它没有受到约束。
但是对于较低级别的菜单项,它可以按预期工作。我认为这应该是我的HierarchicalDataTemplate
的问题,但我无法找到它,因为我看到模板中没有可能影响顶层MenuItem的命令绑定的代码。 / p>
MenuItemViewModel
实现INotifyPropertyChanged
并包含以下公共属性:
string Text
Uri ImageSource
ICommand Command
ObservableCollection<MenuItemViewModel> Children
我HierarchicalDataTemplate
中的MenuItem的 Window.Resources
如下:
<HierarchicalDataTemplate DataType="{x:Type common: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}" VerticalAlignment="Center"/>
</StackPanel>
</HierarchicalDataTemplate>
你能指出我的错误吗?
编辑:顶级MenuItem不包含任何子节点(即关联的ViewModel的Children
集合为空)。
答案 0 :(得分:0)
感谢@sTrenat comment我已经解决了以下问题。
<Menu.Resources>
<!-- cancel sharing of image so Icon will work properly -->
<Image x:Key="MenuIcon" Source="{Binding ImageSource}" x:Shared="False"/>
</Menu.Resources>
<Menu.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}"
BasedOn="{StaticResource {x:Type MenuItem}}">
<Setter Property="Header" Value="{Binding Text}" />
<Setter Property="Icon" Value="{StaticResource MenuIcon}"/>
<Setter Property="Command" Value="{Binding Command}"/>
<Setter Property="ItemsSource" Value="{Binding Children}" />
<!-- centering MenuItem's Header -->
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Content="{Binding}" />
</DataTemplate>
</Setter.Value>
</Setter>
<!-- setting Icon to null when ImageSource isn't specified -->
<Style.Triggers>
<DataTrigger Binding="{Binding ImageSource}"
Value="{x:Null}">
<Setter Property="Icon" Value="{x:Null}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Menu.ItemContainerStyle>