MVVM RelayCommand可以执行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MVVM RelayCommand可以执行相关的知识,希望对你有一定的参考价值。
我正在实现带有execute和canExecute部分的RelayCommand。 RelayCommand在没有canExecute部分时可以工作,但是当我添加canExecute部分时,该命令将锁定按钮。 RelayCommand仅检查CanExecute部分为true时是否可以执行按钮。一旦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函数。
花了我一天的时间来找出我的应用程序到底出了什么问题。希望对您有所帮助。
Here是开发人员的博客文章,解释了为什么这样做是必要的。
如果使用的是未修补的.net 4.5。微软打破了.CanExecute
事件。
如果您正在使用RelayCommand
中的http://msdn.microsoft.com/en-us/magazine/dd419663.aspx#id0090030,并且在redoStack发生更改时没有引发CanExecuteChanged事件。
(从Silverlight的角度进行回答,因此假设这将对您有所帮助。)
您在哪里进行RedoCommand.RaiseCanExecuteChanged()
吗?一旦您监视任何条件的变化,您都需要手动引发此命令。
编辑
因为您使用的是MVVM Light。这里是示例代码:
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();
// At this point, your stacks have changed; that is, the stacks
// may or may not contain items. Thus, raise the commands CanExecute part
// which will in turn enable/disable the commands based on the functions
// return value
RedoCommand.RaiseCanExecuteChanged();
// assuming you could possibly have an UndoCommand somewhere
UndoCommand.RaiseCanExecuteChanged();
}
以上是关于MVVM RelayCommand可以执行的主要内容,如果未能解决你的问题,请参考以下文章
如何将 RelayCommand 与 MVVM Light 框架一起使用
在 WPF MVVM Light 中多次绑定到 RelayCommand