【问题标题】:RaiseCanExecuteChanged eventRaiseCanExecuteChanged 事件
【发布时间】:2011-05-18 17:13:02
【问题描述】:

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

【问题讨论】:

    标签: silverlight mvvm mvvm-light


    【解决方案1】:

    命令观察者订阅的 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); }
    }
    

    【讨论】:

    • 我的 ICommand 实现包括一个事件处理程序:CanExecuteChanged。例如,如果我有一个名为 GetListCommand = new DelegateCommand (LoadList,CanLoadList) 的命令...我将如何触发 CanExecuteChanged 事件?
    • @greg: public void FireCanExecuteChanged(){ CanExecuteChanged(this, EventArgs.Empty); } 是一个非常简单的实现(可能偶尔会抛出 NullReferenceException)
    • 好的,什么叫 FireCanExecuteChanged ?
    • @greg:ICommand 所在的 ViewModel。它的 ViewModel 知道其内部状态,并且知道特定命令的 CanExecute 值何时发生变化。
    • 对不起,我理解你的解释,但我不确定编码。在上面的示例中,我不能使用 GetListCommand.FireCanExecuteChanged(),也不能调用 FireExecuteChanged()。你能给我一个例子吗?谢谢
    猜你喜欢
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2012-10-25
    相关资源
    最近更新 更多