RaiseCanExecuteChanged事件

时间:2011-05-18 17:13:03

标签: silverlight mvvm mvvm-light

我正处于一个项目的阶段,我需要根据各种业务规则控制启用/禁用某些超链接。我注意到RaiseCanExecuteChanged事件的所有主题都引用了MVVM光。这是否意味着我必须使用MVVM灯或者是否有办法使用标准MVVM访问此事件。如果是这样,怎么样?感谢

1 个答案:

答案 0 :(得分:2)

命令观察者订阅的ICommands have an event。当此事件触发时,观察者(按钮等)有责任调用CanExecute以确定他们是否应启用/禁用自己。

由于必须实现ICommand,因此还必须为ViewModel(或其他任何设备)提供一种方法,以便从ICommand实例外部触发此事件。你如何做到这一点取决于你。通常(根据我的经验)在您的ICommand实现上放置一个名为FireCanExecuteChanged的方法,您可以调用该方法来通知实例它们应该触发CanExecute事件。


这是一个模糊c#类伪代码的例子。

public sealed class MyViewModel
{
  // dependencyproperty definition left off for brevity

  public MyCommand ACommand {get;private set;}

  // fired when some DP changes which affects if ACommand can fire    
  private static void OnSomeDependencyPropertyChanged
      (object sender, EventArgs e)
  {
    (sender as MyViewModel).ACommand.FireCanExecuteChanged();
  }
}

public sealed class MyCommand : ICommand
{
  public event EventHandler CanExecuteChanged;
  public bool CanExecute(object arg) { return arg != null; }
  public void Execute(object arg) { throw new NotImplementedException(); }
  public void FireCanExecuteChanged() { 
                  CanExecuteChanged(this, EventArgs.Empty); }
}