这似乎是一个愚蠢的问题,但我正处于一个学习曲线中,所以问这个问题。
事实上,我正试图找到以前未解决的问题的替代方案:
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来获得相同的行为吗?或者另一种方式?
定义一个事件并订阅它会在方法执行中产生相同的行为吗?
答案 0 :(得分:2)
您可以从另一个方法中执行命令。
首先,建议使用bool
来检查命令是否可以执行 - 它返回.Execute()
如果你确实可以执行commnad,那么你可以在该命令上调用ICommand
。
示例:强>
让我们说RelayCommand
是MyCommand
,并称为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来使用这些方法。
希望这有帮助! :)