我有多个页面的MVVM应用程序。我的所有页面都ReadCommand()
绑定了:
<i:Interaction.Triggers>
<i:EventTrigger EventName="Loaded">
<i:InvokeCommandAction Command="{Binding ReadCommand}" CommandParameter="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
这是我在ViewModel中的Read()
命令:
private void Read(object parameter)
{
HwDevice Device = new HwDevice();
this.Alarms = Device.Alarms; // this is slow (reading data from RS232 device)
Device.Dispose();
}
一个页面的数据源速度很慢,我的应用程序在加载此页面时被冻结(约5秒)。
我想在整个窗口设置等待光标,但我不知道如何在MVVM(Im MVVM newbie)中做到这一点。我是否必须通过命令参数传递窗口引用并在命令中设置Wait cursor?如果我应该 - 我怎么能在XAML中做到这一点?
答案 0 :(得分:1)
问题在于您要执行操作的线程与您的UI所在的线程相同。正是在这里,BackgroundWorker派上用场。
"BootstrapCol": {
"prefix": "BSCol",
"body": [
"<div class="col-$1">$0</div><!-- ./col-{REPEAT WHAT IS BEING TYPED HERE} -->"
],
"description": "Create a Bootstrap Grid col Markup"
}
前一部分是宣言。现在您需要实现事件,但首先修改Read方法
BackgroundWorker bw = new BackgroundWorker();
bw.RunWorkerAsync += bw_DoWork;
bw.ProgressChanged += bw_ProgressChanged;
bw.RunWorkerCompleted += bw_WorkDone
既然逻辑放在另一个线程上,你可以使用progressChanged方法来做各种事情。就像显示进度条来报告状态一样,或者只是启用或禁用等待光标。
编辑:您无需将bw传递给用户界面。如果您正在使用MVVM(就像您应该和您正在做的那样),您可以利用绑定和事件,或者实现接口like this one。整个事情的关键在于UI只是“被告知”背景上正在发生的事情,避免冻结主线程。您只需要决定如何显示它。所以它可以是使用等待光标,也可以是实现进度条。