wpf - 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();
}
}
我有几个问题。
- 主要问题是在 ReadFile() 之类的方法中设置 FileMessage 之类的属性不会导致在 ReadFile 完成之前更新视图。
- 使用当时成功的 RaisePropertyChanged() 和使用什么都不做的 Set() 是有区别的。尽管后者确实在这种方法之外起作用。
- 该问题扩展到其他元素,例如 DataView 上的 DataGrid。
想知道被调用的方法是否应该是异步的,但这似乎不合逻辑。我还没有尝试过,因为这并不真正符合我想要实现的目标。
那么发生了什么?我忽略了什么吗?这是框架的限制吗?或者这是一个错误?
谢谢!
解决方案
主要问题是在 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!";
}
推荐阅读
- tsql - 获取 sqlserver 表中的重复元素
- python - makemigration 导致错误“TypeError:预期的 str、bytes 或 os.PathLike 对象,而不是 NoneType”
- php - 如何修复未知属性 – yii\base\UnknownPropertyException
- ruby-on-rails - Rails Active Storage 创建直接下载链接
- excel - 每行的VBA自动填充
- php - ErrorException (E_ERROR) 在 null 上调用成员函数 format()(查看:/home/p4t5z8n7/app-dividendos/resources/views/home.blade.php)
- install4j - Install4j - 有没有办法以编程方式禁用对以前安装的检测?
- ionic-framework - 默认情况下,firebase 是否使用本地存储来保持身份验证状态?
- python - 我制作了一个注册 api 并使用它返回未提供身份验证凭据
- django - 在 Django ORM 中,它们是否等同于 EntityFramework 命令 EnsureCreated 和 EnsureDeleted?