【发布时间】:2014-03-07 16:31:46
【问题描述】:
这几天让我发疯了!
我无法让命令的“已执行”部分在菜单“1 级”以下的任何内容上触发。我可以看到始终在所有菜单项上调用“CanExecute”回调,并且回调始终返回 true。
请有人指出我正确的方向吗?我知道我可以在 MyTypes:MyMenuDescriptorType 中添加 ICommand 的实现,但这不适合我想要实现的模型。
在此先感谢
private void CreateActionCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
e.Handled = true;
}
private void CreateActionCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
Debug.WriteLine("This only happens on Level 1");
}
<UserControl.Resources>
<ResourceDictionary>
<RoutedUICommand x:Key="CreateAction" Text="CreateAction"/>
</ResourceDictionary>
</UserControl.Resources>
<Grid x:Name="LayoutRoot">
<Menu>
<Menu.CommandBindings>
<CommandBinding Command="{StaticResource CreateAction}" Executed="CreateActionCommand_Executed" CanExecute="CreateActionCommand_CanExecute"/>
</Menu.CommandBindings>
<Menu.Resources>
<Style x:Key="MyMenuStyle" TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="{Binding Description}"/>
<Setter Property="Command" Value="{StaticResource CreateAction}" />
<Setter Property="CommandParameter" Value="{Binding}"/>
<Setter Property="CommandTarget" Value="{Binding Path=., RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"/>
</Style>
</Menu.Resources>
<MenuItem Header="Root Level">
<MenuItem Header="Level 1" ItemsSource="{Binding MyListOfThings}" ItemContainerStyle="{StaticResource MyMenuStyle}">
<MenuItem.Resources>
<HierarchicalDataTemplate
DataType="{x:Type MyTypes:MyMenuDescriptorType}"
ItemsSource="{Binding Path=Children}"
ItemContainerStyle="{StaticResource MyMenuStyle}"/>
</MenuItem.Resources>
</MenuItem>
</MenuItem>
</Menu>
</Grid>
更新:我已经弄清楚出了什么问题。我的简化示例没有更新属性“MyListOfThings”。如果我在菜单的 PreviewMouseLeftButtonDown 事件中更新“MyListOfThings”,则控件会执行奇怪的操作并且命令不会触发。但是,如果我在 MouseOver 事件中更新属性,那么一切都会按预期工作!
我不确定这是为什么。也许有人可以解释一下?
【问题讨论】:
标签: c# wpf hierarchicaldatatemplate commandbinding