我正在尝试删除文件目录,对于我删除的每个文件,我想使用当前正在删除的文件名更新UI。
以下是我在ViewModel中的代码:
private void ExecuteDeleteCommand()
{
var files = new DirectoryInfo(BackupDirectory).GetFiles();
foreach (var file in files)
{
ActivityFileName = file.Name;
file.Delete();
}
}
XAML(没什么特别的,只是一个TextBlock
):
<TextBlock Text="{Binding ActivityFileName}"/>
发生了什么,该目录中的文件被删除,但UI只是在迭代中非常最后文件上进行更新。
ActivityFileName
来电OnPropertyChanged
,所以我知道这不是问题所在。
我创建了一个大约有23k文件的目录,所以我知道在完成时我应该看到的不是最后一个文件。
我很困惑为什么它没有在每次通话时更新用户界面。
答案 0 :(得分:1)
问题是您正在使用UI线程来完成工作。因此,在ExecuteDeleteCommand()返回之前,UI不会更新。
如果您想要更新UI,那么您需要在后台线程上进行工作。请记住,需要将OnPropertyChanged()调用分派回UI线程。
答案 1 :(得分:1)
使用Background Worker,但在文件删除线程中,使用ReportProgress
方法将文件名传回UI线程。然后,在UI线程中,订阅Background Worker's ProgressChanged
事件并检索在调用ReportProgress
期间传入的文件名。您可以使用UserState对象将文件名传递给UI线程,以告诉用户您当前正在处理的文件。
答案 2 :(得分:1)
UI线程速度不够快,无法跟上来自delete循环的大量事件。与此同时,我假设用户没有尝试扫描23k文件名以确保一切正常。
如果需要受影响文件的完整审核列表,则可以将这些值附加到多行文本框,以便在处理结束时更改显而易见。
话虽如此,你可以强制重绘。由于您已经实现了典型的OnPropertyChanged,因此只需包含另一个事件供调度程序重绘:
private static readonly Action EmptyDelegate = delegate() { };
protected void OnPropertyChanged(string name)
{
if (PropertyChanged != null)
{
PropertyChanged.Invoke(this, new PropertyChangedEventArgs(name));
}
this.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate);
}
有关详细信息,请参阅Refresh / Update WPF controls。