【问题标题】:WPF: How to call a method similar to ICommand?WPF:如何调用类似于 ICommand 的方法?
【发布时间】:2016-10-20 08:45:06
【问题描述】:

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

在 MVVM 应用程序中,我们为按钮的命令绑定定义 ICommand,它可以调用另一个方法、加载另一个 ViewModel 或执行一些指令等。

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

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

    });

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

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 来获得相同的行为吗?还是其他方式?

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

【问题讨论】:

  • 您是否可以在您的 ViewModel 中发布您的 ICommand 属性的代码(以及您为其分配委托的位置),好吗?我在下面添加了一个答案-但我不想对您使用的类型过于假设。谢谢
  • 感谢您更新您的问题。太酷了,我只是想看看您是否使用RelayCommand 作为您的命令类型——看看我下面的答案;希望它有所帮助:)
  • 假设if (e.Restart == ApplyRestart.RestartRequired) 是真的。发生什么了? CurrentViewModel = EndViewModel。但随后该方法继续执行,现在是CurrentViewModel = FinishViewModel。我认为您需要在if 的结尾和最后一行之间添加一个else

标签: c# wpf mvvm icommand


【解决方案1】:

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

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

如果您确实可以执行该命令,那么您可以在该命令上调用.Execute()


示例:

假设您的ICommandRelayCommand,并称为MyCommand

假设你想从SomeOtherMethod()调用它:

public RelayCommand MyCommand { get; set; }

public void SomeOtherMethod()
{
    if (MyCommand.CanExecute())
    {
        MyCommand.Execute();
    }
}

如果您使用 DelegateCommand,也可以使用相同的方法 - 我使用 Prism 使用这些方法。

希望这会有所帮助! :)

【讨论】:

  • 谢谢@FarrukhWaheed - 请告诉我你的进展情况:)
  • 是的,它执行没有任何问题,但行为是相同的。它再次没有显示视图,即有和没有 MyCommand.Execute(this) 它从未显示 EndView,但 FinishView。
猜你喜欢
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
相关资源
最近更新 更多