删除文件目录,UI不更新

时间:2014-10-10 13:37:09

标签: c# wpf xaml user-interface

我正在尝试删除文件目录,对于我删除的每个文件,我想使用当前正在删除的文件名更新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文件的目录,所以我知道在完成时我应该看到的不是最后一个文件。

我很困惑为什么它没有在每次通话时更新用户界面。

3 个答案:

答案 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