MVVM,打开“慢速”页面时等待光标

MVVM,打开“慢速”页面时等待光标,mvvm,Mvvm,我有多个页面的MVVM应用程序。My all pages已将ReadCommand绑定到: <i:Interaction.Triggers> <i:EventTrigger EventName="Loaded"> <i:InvokeCommandAction Command="{Binding ReadCommand}" CommandParameter="{Binding}"/> </i:EventTrigger>

我有多个页面的MVVM应用程序。My all pages已将ReadCommand绑定到:

<i:Interaction.Triggers>
    <i:EventTrigger EventName="Loaded">
        <i:InvokeCommandAction Command="{Binding ReadCommand}" CommandParameter="{Binding}"/>
    </i:EventTrigger>
</i:Interaction.Triggers>
一个页面的数据源速度较慢,当加载此页面大约5秒时,我的应用程序被冻结


我想在整个窗口上设置等待光标,但我不知道如何在MVVM Im MVVM newbie中实现。我是否必须通过命令参数传递窗口引用并在命令中设置等待光标?如果我应该-如何在XAML中执行它?

问题是,执行操作的线程与UI所在的线程相同。正是在这里,这本书派上了用场

BackgroundWorker bw = new BackgroundWorker();
bw.RunWorkerAsync += bw_DoWork;
bw.ProgressChanged += bw_ProgressChanged;
bw.RunWorkerCompleted += bw_WorkDone
前一部分是宣言。现在您需要实现这些事件,但首先要修改Read方法

private void Read(object parameter)
{
     bw.RunWorkerAsync(parameter);
     // put your logic here
}

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    object parameter = e.Argument;
}
现在,逻辑被放置在另一个线程上,您可以使用progressChanged方法执行各种操作。比如显示进度条来报告状态,或者简单地启用或禁用等待光标


编辑:您不需要将bw传递给UI。如果您像应该的那样使用MVVM,并且正在这样做,那么您可以使用绑定和事件,或者实现一个接口。整个过程的要点是,UI只是被告知后台正在进行某些操作,从而避免冻结主线程。您只需要决定如何显示它。因此,它可以使用等待游标,也可以实现进度条

但是如何将bw引用从ViewModel传递到UI?我应该在ViewModel中创建对象并将UI绑定到它吗?@Kamil我扩展了我的回答。您不需要将bw传递给UI。bw通过它的事件通知UI一些相应的操作,例如显示一个进度条,而bw将完成它的工作
private void Read(object parameter)
{
     bw.RunWorkerAsync(parameter);
     // put your logic here
}

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    object parameter = e.Argument;
}