2016-05-23 6 views
0

Ich versuche, ein WPF-Benutzersteuerelement, das ich erstellt habe, ein Kontextmenü hinzuzufügen. Das Menü, das Symbol und der Befehl werden angezeigt, aber im Menü ist es ausgegraut, obwohl ich CommandBinding_CanExecute auf True gesetzt habe.Hinzufügen von Kontextmenü mit RoutedUICommand zu Wpf UserControl

Hier ist die XAML

<UserControl x:Class="KeyframePartialApp.ctrCell" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:KeyframePartialApp" 
     mc:Ignorable="d"> 

<UserControl.Resources> 
    <RoutedUICommand x:Key="MakeKeyCell" Text="Make KeyCell" /> 
</UserControl.Resources> 


<Border x:Name="bdrBackground" Width="14" Height="24" BorderBrush="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" BorderThickness="1" Background="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" > 
    <Border.ContextMenu> 
     <ContextMenu> 
      <MenuItem Icon="{StaticResource imgKeyIcon}" Command="{StaticResource MakeKeyCell}"></MenuItem> 
     </ContextMenu> 
    </Border.ContextMenu> 
    <Border.CommandBindings> 
     <CommandBinding Command="{StaticResource MakeKeyCell}" CanExecute="CommandBinding_CanExecute" Executed="MakeKeyCell_Executed"></CommandBinding> 
    </Border.CommandBindings> 
    <Rectangle Width="10" Height="10" x:Name="rctIcon" /> 
</Border> 

und hier ist der Code hinter

public partial class ctrCell : UserControl 
{ 
    private Cell _cell; 

    public ctrCell(Cell cell) 
    { 
     _cell = cell; 
     InitializeComponent(); 
     _cell.PropertyChanged += _cell_PropertyChanged; 
     UpdateKeyCellImage(); 
    } 

    private void _cell_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) 
    { 
     if (e.PropertyName == "isKeyCell") UpdateKeyCellImage(); 
    } 

    public void UpdateKeyCellImage() 
    { 
     if (_cell.isKeyCell) 
     { 
      rctIcon.Fill = (ImageBrush)Application.Current.Resources["ibKeycell"]; 
     } 
     else 
     { 
      rctIcon.Fill = null; 
     } 
    } 

    private void MakeKeyCell_Executed(object sender, ExecutedRoutedEventArgs e) 
    { 
     _cell.isKeyCell = true; 

    } 

    private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
    { 
     if (!_cell.isKeyCell) e.CanExecute = true; 
    } 
} 

}

Antwort

0

Dies ist ein Duplikat: WPF custom command in context menu are disabled until any button clicked

Mit Kredit auf die Antwort von Simon D., der Vollständigkeit halber ich hier beantworten:

Eine ausführlichere Erklärung finden Sie hier könnte: http://www.wpftutorial.net/RoutedCommandsInContextMenu.html

Um das Problem zu beheben, fügen Sie einfach den Command zu Ihrem MenuItem :

<Border.ContextMenu> 
    <ContextMenu> 
     <MenuItem IsEnabled="True" 
        Command="{StaticResource MakeKeyCell}" 
        CommandTarget="{Binding Path=PlacementTarget, 
              RelativeSource={RelativeSource FindAncestor, 
              AncestorType={x:Type ContextMenu}}}" /> 
    </ContextMenu> 
</Border.ContextMenu>