我一直在努力追查这个问题已经有一段时间了,并且正在绘制一个完全空白的东西,所以也许我遗漏了一些其他人可能会看到的东西?注意:这目前只能在一台 QA 机器上看到,因此我不能像往常一样调试它
我正在使用Josh Smith 的代码项目中的命令组代码,CommandReference
并在这篇文章的底部实现。
问题是绑定到的按钮CommandGroup
被禁用,但其他两个没有。请注意,该CommandGroup
按钮只是其他两个的串联。因此,如果两者都启用,那么CommandGroup
按钮也应该启用。所以,我猜这与CommandGroup
or CommandReference
...任何想法都会有帮助。
我目前的工作假设是,ApplicationCommands.Close
被视为ICommand
与CommandGroup
正常的 RoutedUICommand 相比是问题所在。特别是因为我可以通过直接调用在绑定到同一命令的两个按钮之间创建不平衡ApplicationCommands.Close.CanExecute(null)
。但是,我不确定如何解决这个问题......
RoutedCommand
'sCanExecute
使用这个FilterInputElement(Keyboard.FocusedElement)
ifCanExecute
在没有IInputElement
...的情况下被调用但是在我上面尝试的情况下,ApplicationCommands.Close
无论它的起源来自哪里,我都在调用它
指挥组
<Button Content="OK" IsDefault="True">
<Button.Resources>
<commonCommands:CommandReference x:Key="SaveCommand" Command="{Binding SaveDeviceCommand}"/>
</Button.Resources>
<Button.Command>
<commonCommands:CommandGroup>
<commonCommands:CommandGroup.Commands>
<commonCommands:CommandReference Command="{StaticResource SaveCommand}"/>
<x:Static Member="ApplicationCommands.Close"/>
</commonCommands:CommandGroup.Commands>
</commonCommands:CommandGroup>
</Button.Command>
</Button>
<Button Content="Cancel" Command="ApplicationCommands.Close" IsCancel="True"/>
<Button Content="Apply" Command="{Binding SaveDeviceCommand}"/>
命令参考:
public class CommandReference : Freezable, ICommand
{
public static readonly DependencyProperty CommandProperty =
DependencyProperty.Register("Command", typeof (ICommand), typeof (CommandReference), new PropertyMetadata(OnCommandChanged));
public ICommand Command
{
get { return (ICommand) GetValue(CommandProperty); }
set { SetValue(CommandProperty, value); }
}
#region ICommand Members
public bool CanExecute(object parameter)
{
return Command != null && Command.CanExecute(parameter);
}
public void Execute(object parameter)
{
Command.Execute(parameter);
}
public event EventHandler CanExecuteChanged;
private static void OnCommandChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
{
var commandReference = dependencyObject as CommandReference;
if (commandReference == null) return;
var oldCommand = eventArgs.OldValue as ICommand;
var newCommand = eventArgs.NewValue as ICommand;
if (oldCommand != null)
oldCommand.CanExecuteChanged -= commandReference.CanExecuteChanged;
if (newCommand != null)
newCommand.CanExecuteChanged += commandReference.CanExecuteChanged;
}
#endregion
#region Freezable
protected override Freezable CreateInstanceCore()
{
throw new NotImplementedException();
}
#endregion
}