以下は、メトロAPIとデータバインディング(MVVMを使用)を使用してドロップダウンリストのフォルダーのリストにデータを入力するサンプル実装です。
ビューモデルのコンストラクターは、SetFoldersメソッド(プライベート非同期)を使用します。このメソッドは、待機可能なメソッドfileService.GetFoldersAsync()を呼び出してフォルダーのリストを取得します。次に、フォルダリストが「FoldersList」というプロパティに割り当てられます。XAMLはこのプロパティを使用して、データバインディングを使用してドロップダウンリストにデータを入力します。
以下のようにコンストラクターで設定せずにFoldersListプロパティを設定するより良い方法があるのだろうか。実際のデータバインディングが発生したときに(クラスの初期化中ではなく)、GetFilesAsyncメソッドを呼び出してFilesListプロパティ値を設定したいと思います。プロパティは(私が知る限り)async / await修飾子をサポートしていないため、適切なソリューションを実装するのに苦労しています。どんなアイデアでも大歓迎です。
コードは以下のとおりです。
ViewModel
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();
}
}