首页 > 解决方案 > MvvmLight:从 RelayCommand 执行中设置属性时视图未更新

问题描述

由于在开发人员的 GitHub 上没有任何回应,我将在这里重复我的问题。我希望有人能以某种方式帮助我。

这是我第一次使用 MvvmLight,所以我希望我没有忽略一些明显的东西。

在我的 WPF ViewModel 中,我有类似的东西:

  private ICommand readFileCommand;
  public ICommand ReadFileCommand => readFileCommand ?? (readFileCommand = new RelayCommand(ReadFile));

  private void ReadFile()
  {
        FileMessage = "Message.";
  }

  private string fileMessage;
  public string FileMessage
  {
       get { return fileMessage; }
       set
       {
           //Set(ref fileMessage, value);

           fileMessage = value;
           RaisePropertyChanged();
       }
   }

我有几个问题。

想知道被调用的方法是否应该是异步的,但这似乎不合逻辑。我还没有尝试过,因为这并不真正符合我想要实现的目标。

那么发生了什么?我忽略了什么吗?这是框架的限制吗?或者这是一个错误?

谢谢!

标签: wpfmvvm-lightrelaycommand

解决方案


主要问题是在 ReadFile() 之类的方法中设置 FileMessage 之类的属性不会导致在 ReadFile 完成之前更新视图。

这是有道理的,因为您不能同时ReadFile在同一个线程上执行您的方法和更新 UI。这与 MvvmLight 或命令无关。

如果在后台线程上异步或同步运行任何可能长时间运行的代码之前设置属性,它应该按预期工作。

试试这个例如:

private async void ReadFile()
{
    FileMessage = "Message.";
    await Task.Delay(5000); //simulate...
    FileMessage = "Done!";
}

或这个:

private async void ReadFile()
{
    FileMessage = "Message.";
    await Task.Run(() => Thread.Sleep(5000));
    FileMessage = "Done!";
}

推荐阅读