【发布时间】:2011-05-18 17:13:02
【问题描述】:
我正处于一个项目阶段,我需要根据各种业务规则来控制启用/禁用某些超链接。我注意到有关 RaiseCanExecuteChanged 事件的所有主题都参考了 MVVM 灯。这是否意味着我必须使用 MVVM 灯,或者是否有办法使用标准 MVVM 访问此事件。如果是这样,怎么做?谢谢
【问题讨论】:
标签: silverlight mvvm mvvm-light
我正处于一个项目阶段,我需要根据各种业务规则来控制启用/禁用某些超链接。我注意到有关 RaiseCanExecuteChanged 事件的所有主题都参考了 MVVM 灯。这是否意味着我必须使用 MVVM 灯,或者是否有办法使用标准 MVVM 访问此事件。如果是这样,怎么做?谢谢
【问题讨论】:
标签: silverlight mvvm mvvm-light
命令观察者订阅的 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); }
}
【讨论】:
public void FireCanExecuteChanged(){ CanExecuteChanged(this, EventArgs.Empty); } 是一个非常简单的实现(可能偶尔会抛出 NullReferenceException)