首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVVM RelayCommand CanExecute

MVVM RelayCommand CanExecute
EN

Stack Overflow用户
提问于 2013-10-14 16:01:56
回答 4查看 20.7K关注 0票数 9

我正在用execute和canExecute部件实现一个canExecute。RelayCommand在没有canExecute部件的情况下工作,但是当我添加canExecute部件时,命令会锁定按钮。RelayCommand只检查按钮是否可以执行,只要CanExecute部件是真的。一旦canExecute部件变为false,即使应该单击按钮,也不能再单击该按钮。如何确保每次单击该按钮时,它都会控制它是否可以执行,而不会在无法执行时永远锁定它?

代码语言:javascript
复制
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; }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-10-22 08:28:20

由于某些原因,您必须执行以下操作:

代码语言:javascript
复制
public RelayCommand RedoCommand{
     get;
     set;
}

根据访问级别的不同,还可以在设置可选选项之前将私有设置为私有。那你就做了

代码语言:javascript
复制
RedoCommand = new RelayCommand(() => undoRedoController.Redo(), () => undoRedoController.CanRedo());

现在,您可以调用RedoCommand.RaiseCanExecuteChanged();一切都正常。

票数 6
EN

Stack Overflow用户

发布于 2015-10-15 13:29:55

由于在MVVMLight 4.5UPDATE之后,CommandManager不再触发check,所以.NET中断了。这个问题已经解决了。不应该包含GalaSoft.MvvmLight.Command名称空间,而应该使用GalaSoft.MvvmLight.CommandWpf命名空间。该命名空间中定义的RelayCommand仍在检查传递给命令的CanExecute函数。

我花了一天时间才知道我的申请到底出了什么问题。我希望这会对你们中的一些人有所帮助。

这里是开发人员的一篇博客文章,解释了为什么这是必要的。

票数 15
EN

Stack Overflow用户

发布于 2013-10-14 16:09:21

如果您正在使用未修补的.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#id0090030http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030,并且在redoStack更改时不会引发CanExecuteChanged事件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19364364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档