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