MVVM RelayCommand CanExecute

Jon*_*N89 7 wpf relaycommand mvvm-light canexecute windows-phone-8

我正在实现一个带有execute和canExecute部分的RelayCommand.RelayCommand在没有canExecute部分的情况下工作,但是当我添加canExecute部分时,该命令会锁定按钮.只要CanExecute部分为true,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; }
Run Code Online (Sandbox Code Playgroud)

SSX*_*3PY 12

MVVMLight已经中断了,因为在.NET 4.5更新之后,CommandManager不再触发can执行检查.这已经解决了.您应该使用GalaSoft.MvvmLight.CommandWpf命名空间,而不是包含GalaSoft.MvvmLight.Command命名空间.在该命名空间中定义的RelayCommand仍在检查传递给命令的CanExecute函数.

花了我一天的时间来了解我的应用程序到底出了什么问题.我希望这会对你们有些人有所帮助

  • 谢谢!由于您的回答,我不必找一天;) (3认同)

JTI*_*TIM 6

出于某种原因,您必须执行以下操作:

public RelayCommand RedoCommand{
     get;
     set;
}
Run Code Online (Sandbox Code Playgroud)

您也可以在设置可选之前将其设为私有,具体取决于您的访问级别.然后你做

RedoCommand = new RelayCommand(() => undoRedoController.Redo(), () => undoRedoController.CanRedo());
Run Code Online (Sandbox Code Playgroud)

现在你可以调用RedoCommand.RaiseCanExecuteChanged(); 一切正常.

  • 确保使用CommandWPF命名空间,因为在Command命名空间中RelayCommand CanExecute已中断.见http://blog.jsinh.in/relay-command-canexecute-not-working-using-mvvmlight-toolkit-in-wpf/#.VYGoOvnmv30 (5认同)