WPF:如何调用类似于ICommand的方法?

时间:2016-10-20 08:45:06

标签: c# wpf mvvm icommand

这似乎是一个愚蠢的问题,但我正处于一个学习曲线中,所以问这个问题。 事实上,我正试图找到以前未解决的问题的替代方案: WPF: How to make Calls to Dispatcher.Invoke() Synchronous?

在MVVM应用程序中,我们为Button的Command Binding定义ICommand,它可以调用另一种方法,加载另一个ViewModel或执行一些指令等。

使用代码更新 这是我的ICommand,绑定到按钮,它将加载ViewModel以显示EndView:

  public ICommand EndCommand => new RelayCommand(p =>
    {
        WixBootstrapperData.CurrentViewModel = new EndViewModel(WixBootstrapperData);

    });

但是当我尝试从另一个方法加载相同的ViewModel时,它进行了加载,但从未显示过EndView,并跳到其他指令直到方法结束,这实际上是应用程序本身的结束。这是片段:

BootstrapperApplication.ApplyComplete + =(sender,e)=>        {

       WixBootstrapperData.CurrentDispatcher.Invoke((Action)(() =>
       {
           if (e.Restart == ApplyRestart.RestartRequired)
           {
               //This would be loaded, but never showed the related View and skipped to next instruction
               WixBootstrapperData.CurrentViewModel = new EndViewModel(WixBootstrapperData); 

           }
           //However, This would be loaded and related View would also be displayed
           WixBootstrapperData.CurrentViewModel = new FinishViewModel(WixBootstrapperData);
       }
       ));
   }

我们可以从另一个方法调用相同的ICommand来获得相同的行为吗?或者另一种方式?

定义一个事件并订阅它会在方法执行中产生相同的行为吗?

1 个答案:

答案 0 :(得分:2)

您可以从另一个方法中执行命令。

首先,建议使用bool来检查命令是否可以执行 - 它返回.Execute()

如果你确实可以执行commnad,那么你可以在该命令上调用ICommand

示例:

让我们说RelayCommandMyCommand,并称为SomeOtherMethod()

我们假设您要从public RelayCommand MyCommand { get; set; } public void SomeOtherMethod() { if (MyCommand.CanExecute()) { MyCommand.Execute(); } }

调用它
DelegateCommand

如果您使用>>> a = 1 >>> if a == 0: ... print a ... else: ... try: ... print b ... except Exception as e: ... print 'Caught Exception: ', e # where e is the exception string ... Caught Exception: name 'b' is not defined ,也可以使用相同的方法 - 我使用Prism来使用这些方法。

希望这有帮助! :)