【发布时间】: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。