Как обновить свойство viewmodel, которое выбирается асинхронно? - PullRequest
1 голос
/ 29 марта 2019

В моей FolderViewModel у меня есть

public string FolderPath
        {
            get
            {
                if (folderPath == null)
                {
                    GetFolderPathAsync();
                    return "Loading...";
                }
                return folderPath;
            }
            set
            {
                folderPath = value;
                Changed(nameof(FolderPath));
            }
        }

GetFolderPathAsync - это асинхронный метод, который выполняет серверные вызовы для извлечения пути и устанавливает FolderPath.

Теперь в другом классе я создаю folderviewmodels иустановить их пути таким образом

folderViewModel.FolderPath = parent.FolderPath+"/"+folder.Name;

Проблема в том, что get в конечном итоге получает значение «Загрузка ... / имя_фолдера» и никогда не обновляется, когда путь к папке родительской папки обновляется из «загрузка ..msgstr "после его получения с сервера.как я могу это исправить?Я не очень хорош с многопоточностью, поэтому я действительно не знаю, как это исправить.мне было интересно, если есть способ, которым я мог бы сделать настройку folderPath ждать завершения GetFolderPathAsync как-нибудь?

спасибо за помощь!

1 Ответ

0 голосов
/ 29 марта 2019

Свойство не должно запускать асинхронную операцию. Это основная причина, по которой свойства async не поддерживаются в C #. Пожалуйста, обратитесь к @ блогу Стивена Клири за дополнительной информацией.

Если вместо этого вы вызываете метод GetFolderPathAsync из метода async, вы можете await его и затем установить для свойства с привязкой к данным значение «Загрузка ...» после его завершения. Это предполагает, что GetFolderPathAsync возвращает Task или Task<T>:

public string FolderPath
{
    get
    {
        return folderPath;
    }
    set
    {
        folderPath = value;
        Changed(nameof(FolderPath));
    }
}
...
folderViewModel.FolderPath = parent.FolderPath+"/"+folder.Name;
await folderViewModel.GetFolderPathAsync();
folderViewModel.FolderPath = "Loading...";

Другой вариант заключается в использовании метода ContinueWith для создания продолжения, которое выполняется асинхронно после завершения задачи:

if (folderPath == null)
{
    GetFolderPathAsync().ContinueWith(_ => 
    {
        folderPath = "Loading...";
        Changed(nameof(FolderPath));
    });
    return folderPath;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...