Dưới đây là triển khai mẫu sử dụng API tàu điện ngầm và ràng buộc dữ liệu (sử dụng MVVM) để điền danh sách thư mục vào danh sách thả xuống.Gán kết quả async thành thuộc tính ràng buộc dữ liệu
Phương thức khởi tạo của mô hình Xem sử dụng phương thức SetFolders (không đồng bộ riêng tư), gọi phương thức awsable fileService.GetFoldersAsync() để nhận danh sách các thư mục. Danh sách thư mục sau đó được gán cho thuộc tính được gọi là "FoldersList". XAML sử dụng thuộc tính này để điền một danh sách thả xuống bằng cách sử dụng ràng buộc dữ liệu.
Tôi tự hỏi có cách nào tốt hơn để đặt thuộc tính FoldersList mà không phải đặt nó trong hàm tạo như sau. Tôi muốn gọi phương thức GetFilesAsync và thiết lập giá trị thuộc tính FilesList, khi liên kết dữ liệu thực tế xảy ra (không phải trong lớp init). Vì các thuộc tính không hỗ trợ các trình sửa đổi không đồng bộ/chờ đợi (theo như tôi biết), tôi đang cố gắng thực hiện một giải pháp thích hợp. Bất kỳ ý tưởng đánh giá rất nhiều.
Mã bên dưới.
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 và thực hiện
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();
}
}
Tôi thấy có vấn đề với câu trả lời này. Các getter của tài sản Thư mục không chờ đợi LoadData đó là tốt như nó nên chặn. Nhưng trong LoadData một chức năng được chờ đợi để kiểm soát được trả lại cho người gọi/tài sản. Đối với tôi điều này ngụ ý rằng các _folders không nhất thiết phải khởi tạo và do đó thuộc tính Folders cũng có thể trả về null. – buckley
Có, điều khiển sẽ được đưa trở lại bộ thu thập. Nhưng nó không phải là một vấn đề, vì các IsLoading bất động sản sẽ được thiết lập để đúng, báo hiệu rằng tải đang được tiến hành. Khi hoàn thành nhiệm vụ fileService.GetFolderAsync(), luồng của phương thức LoadData sẽ tiếp tục như mong đợi. Đúng là thuộc tính Folders sẽ trả về null ở cuối cuộc gọi. Nhưng ngay sau khi hoàn thành nhiệm vụ GetFolderAsync(), một sự kiện PropertyChanged sẽ được nâng lên. – Eilistraee
Trên thực tế, đúng là thuộc tính Thư mục có thể trả về giá trị true. Nó hoạt động như mong đợi: Bạn không muốn chặn cuộc gọi, do đó việc khởi tạo Lazy của dữ liệu không thể xảy ra đồng bộ. Nếu bạn cần chờ LoadData, hãy đặt nó ở chế độ công khai và chờ nó trực tiếp trước khi gọi Thư mục. Nếu không, hãy để Databinding được cập nhật ngay sau khi Dữ liệu có sẵn hoặc dựa vào PropertyChanged. – Eilistraee