Назначение асинхронного результата свойству привязки данных

Ниже приведен пример реализации, использующей Metro API и привязку данных (с помощью MVVM )для заполнения списка папок в раскрывающемся списке.

Конструктор модели View использует метод SetFolders (private async ), который вызывает ожидаемый метод fileService.GetFoldersAsync ()для получения списка папок. Затем список папок назначается свойству «FoldersList». XAML использует это свойство для заполнения раскрывающегося списка с помощью привязки данных.

Интересно, есть ли лучший способ установить свойство FoldersList без необходимости устанавливать его в конструкторе, как показано ниже. Я бы предпочел вызвать метод GetFilesAsync и установить значение свойства FilesList, когда происходит фактическая привязка данных (, а не во время инициализации класса ). Поскольку свойства не поддерживают модификаторы async/await (, насколько я знаю ), я изо всех сил пытаюсь реализовать правильное решение. Любые идеи с благодарностью.

Код ниже.

ВьюМодель

public class FileViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private readonly IFileService fileService;

    public FileDataViewModel(IFileService fileService)
    {
        this.fileService = fileService;
        SetFolders();
    }

    private async void SetFolders ()
    {
        FoldersList = await fileService.GetFoldersAsync();
    }

    private IEnumerable< IStorageFolder > foldersList;
    public IEnumerable<StorageFolder> FoldersList
    {
        get { return foldersList; }
        private set
        {
            foldersList = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("FoldersList"));
            }
        }
    }
}

IFileService и реализация

public interface IFileService    {
    Task<IEnumerable<IStorageFolder>> GetFilesAsync();
  }

public class FileService : IFileService
{
    public async Task<IEnumerable<IStorageFolder>> GetFoldersAsync()
    {
        var folder = KnownFolders.DocumentsLibrary;
        return await folder.GetFoldersAsync();
    }
}
5
задан svick 24 June 2012 в 09:48
поделиться