2017-08-31 50 views
0

我有一个命令“ShowDataCommand”与CanExecute方法。如何从事件中调用CanExecute来禁用命令?

public override bool CanExecute(object parameter) 
{ 
    return _someFacade.CanCommandEnable(); 
} 

当我启动我的应用程序,CanExecute被调用,并根据该值从门面回来,它要么 启用或禁用命令。

现在新的要求是,主页面有一个按钮。当用户单击该按钮时,会打开一个对话框 ,直到打开时间对话框时,应该禁用“ShowDataCommand”。

当对话框打开并且对话框关闭时,已经有一个事件触发。我已经在命令中订阅了该事件。 事件触发具有适当的真实值和错误值。

现在我不知道如何禁用该事件的命令?我能以某种方式提升CanExecute这个新价值吗?

+0

给你的命令类被称为'RaiseCanExecute()'方法,提高了命令对象的'CanExecute'Ë发泄。然后,任何订阅了该活动的人都会相应更新。 –

回答

1

您可以通过提高CanExecuteChanged事件来强制您的命令的CanExecute方法再次被调用。

大多数ICommand实现有一个引发此事件的方法,因此如果您使用自己的实现,则可以向类中添加一个方法,并在您想“刷新”命令时调用它,例如点击按钮时:

public class YourCommandClass : ICommand 
{ 
    ... 
    public void RaiseCanExecuteChanged() //<-- call this method 
    { 
     var handler = CanExecuteChanged; 
     if (handler != null) 
      handler(this, EventArgs.Empty); 
    } 
} 

请参阅RelayCommandMvvmLightICommand实现的例子:https://github.com/paulcbetts/mvvmlight/blob/dce4e748c538ed4e5f5a0ebbfee0f54856f52dc6/GalaSoft.MvvmLight/GalaSoft.MvvmLight%20(NET35)/Command/RelayCommand.cs

+0

感谢您的回复。但是我怎么用bool值来提高它。我的意思是启用或禁用事件触发时 - private void OnDialogStateChanged(bool isDialogOpen) { RaiseCanExecuteChanged(isDialogOpen); } – App

+0

你不知道。您应该设置_someFacade.CanCommandEnable并确保刷新命令时返回true或false。 CanExecute方法应该包含您的逻辑来启用/禁用该命令。 – mm8

+0

任何想法为什么CanExecuteChanged对我而言始终为空?谢谢 – App