Ситуация:
Имам статичен RoutedCommand
, дефиниран така:
public static class Commands
{
public static readonly RoutedCommand GrowingOperation = new RoutedCommand("GrowingOperation", typeof(GrowingDisplay));
}
В моя MyUserControl.xaml
дефинирам командата така:
<UserControl.CommandBindings>
<CommandBinding Command="{x:Static local:Commands.GrowingOperation}"
Executed="GrowingOperationExecuted"
CanExecute="GrowingOperationCanExecute"/>
</UserControl.CommandBindings>
И след това го използвайте по този начин в моите ContextMenu
от моите MyUserControl
:
<UserControl.ContextMenu>
<ContextMenu x:Name="GrowingContextMenu">
<MenuItem Header="Grow"
Command="{x:Static local:Commands.GrowingOperation}"
CommandParameter="grow"/>
</ContextMenu>
</UserControl.ContextMenu>
Проблем:
ContextMenu
се появява, но нито GrowingOperationExecuted
, нито GrowingOperationCanExecute
се извикват. Нито пък получавам изключение при отваряне на ContextMenu
.
Отвореният ContextMenu
изглежда така:
Изглежда, че е активиран, но няма абсолютно никакво взаимодействие, нито дори анимация при задържане. Къде е грешката тук?
РЕДАКТИРАНЕ:
Ето изпълнението на командните методи:
private void GrowingOperationExecuted(object sender, ExecutedRoutedEventArgs e)
{
if (e.Parameter == null)
throw new ArgumentException("ExecutedRoutedEventArgs must contain parameter.");
var task = e.Parameter.ToString().ToLower();
switch (task)
{
case "grow":
Growing.SpeedUpGrowing();
break;
default:
throw new ArgumentOutOfRangeException();
}
}
private void GrowingOperationCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
if (e.Parameter == null)
throw new ArgumentException("ExecutedRoutedEventArgs must contain parameter.");
var task = e.Parameter.ToString().ToLower();
switch (task)
{
case "grow":
e.CanExecute = Growing.CanSpeedUpGrowing();
break;
default:
throw new ArgumentOutOfRangeException();
}
}
РЕДАКТИРАНЕ 2:
Конструкторът на моя MyUserControl
:
public GrowingDisplay()
{
InitializeComponent();
HeightProperty.AddOwner(typeof (GrowingDisplay),
new FrameworkPropertyMetadata(OnHeightPropertyChanged));
WidthProperty.AddOwner(typeof (GrowingDisplay),
new FrameworkPropertyMetadata(OnWidthPropertyChanged));
CommandManager.InvalidateRequerySuggested();
}