MVVM RelayCommand可以执行
我正在执行带有execute和canExecute部分的RelayCommand。 RelayCommand在没有canExecute部分的情况下工作,但是当我添加canExecute部分时,该命令锁定按钮。 只要CanExecute部分为真,RelayCommand只检查是否可以执行该按钮。 一旦canExecute部分变为false,即使应该按钮也不能再点击该按钮。 我如何确保每次点击按钮时控制它是否可以执行,并且一旦无法执行就不会永久锁定它。
RedoCommand = new RelayCommand(undoRedoController.Redo,undoRedoController.CanRedo);
public bool CanRedo()
{
redoStack.Count();
redoStack.Any();
return redoStack.Any();
}
public void Redo()
{
if (redoStack.Count() <= 0) throw new InvalidOperationException();
IUndoRedoCommand command = redoStack.Pop();
undoStack.Push(command);
command.Execute();
}
public class UndoRedoController
{
private static UndoRedoController controller = new UndoRedoController();
private readonly Stack<IUndoRedoCommand> undoStack = new Stack<IUndoRedoCommand>();
private readonly Stack<IUndoRedoCommand> redoStack = new Stack<IUndoRedoCommand>();
private UndoRedoController() { }
public static UndoRedoController GetInstance() { return controller; }
出于某种原因,您必须执行以下操作:
public RelayCommand RedoCommand{
get;
set;
}
您也可以在设置可选之前放置私密,具体取决于您的访问级别。 然后你做
RedoCommand = new RelayCommand(() => undoRedoController.Redo(), () => undoRedoController.CanRedo());
现在你可以调用RedoCommand.RaiseCanExecuteChanged(); 一切正常。
由于在.NET 4.5更新之后CommandManager不再触发可执行检查,因此MVVMLight出现了中断。 这已经解决了。 不应包含GalaSoft.MvvmLight.Command命名空间,您应该使用GalaSoft.MvvmLight.CommandWpf命名空间。 在该命名空间中定义的RelayCommand仍在检查传递给该命令的CanExecute函数。
花了我一天的时间来了解我的应用程序究竟发生了什么问题。 我希望这会帮助你们中的一些人
如果您使用的是未打补丁的.net 4.5。 微软打破了.CanExecute
事件。
http://connect.microsoft.com/VisualStudio/feedback/details/753666/net-4-0-application-commands-canexecute-not-updating-in-4-5
如果您使用http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030中的RelayCommand
,并且在redoStack更改时不引发CanExecuteChanged事件。