這讓我生氣了好幾天了!WPF MenuItem Command.Executed沒有發射,但Command.CanExecute沒有
我無法讓命令的執行部分在我的菜單的'1級'以下的任何東西上觸發。我可以看到'CanExecute'回調總是在所有菜單項上調用,並且回調總是返回true。
請有人指出我在正確的方向嗎?我知道我可以在MyTypes中添加一個ICommand實現:MyMenuDescriptorType,但這不適合我試圖實現的模型。
提前感謝
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事件中的屬性,那麼一切都按預期工作!
我不知道這是爲什麼。也許有人可以解釋?