2010-10-29 103 views
3

是否有可能阻止WPF CommandManager执行连接CanExecute委托?防止WPF CommandManager执行CanExecute

我有一个未处理的异常处理程序例程,显示用户的错误窗口。在CanExecute链的一部分引发异常的情况下,我有一种情况。这会调用显示窗口的异常处理程序。此时,CommandManager会踢入并重新调用CanExecute,抛出另一个异常,调用处理程序,显示另一个窗口,重新调用CanExecute,抛出另一个异常等等等等等等等等。

我需要防止重新运行的CanExecute。我试图简单地忽略处理程序中的后续错误,但这意味着错误窗口中的异常信息是空白的。

+0

有你有你的命令'CanExecuteChanged'事件手动链接到'CommandManager.RequerySuggested'事件? – 2010-10-29 15:31:03

+0

我正在使用Cinch框架,其中包含一个SimpleCommand类,它按照Josh Smith的实现在此执行此操作:http://joshsmithonwpf.wordpress.com/2008/06/17/allowing-commandmanager-to-query-your- icommand-objects/ – Darren 2010-10-29 16:02:47

+0

考虑使用不同的命令实现。如果您有兴趣,请尝试PerrypheralFramework.WPF。这意味着使用框架的ViewModelBase进行工作。当一个属性被改变时,或者当你要求一个视图模型使用一个视图模型方法为它内部的所有命令引发事件时,查询这些命令。 – 2014-11-02 23:53:50

回答

0

最好的资源是关注是从ICommand Interface其中有CanExecuteChanged Event。订阅该事件的操作将被通知禁用自身。

目前还不清楚你的结构是如何设置的,但我会推测原始操作可能会在启动进程时触发此事件,然后在完成时再次触发事件以通知处理的其他命令可以运行。

例始发命令操作通知其他人打开他们的命令之前检查状态的

private void DoTheCommand() 
{ 
    _isProcessingCabExecute = false;  // Turn off all related for this 
              // command (is Execute). 

    _opCommand.RaiseCanExecuteChanged(); // Inform all subscribed to check status 
              // and disable where possible. 

    // The operation 

    _isProcessingCabExecute = true;  // All done turn it back on 
    _opCommand.RaiseCanExecuteChanged(); // Resume operations. 
}