gpt4 book ai didi

c#-4.0 - 将异步结果分配给数据绑定(bind)属性

转载 作者:行者123 更新时间:2023-12-04 18:47:54 27 4
gpt4 key购买 nike

下面是一个示例实现,它使用 Metro API 和数据绑定(bind)(使用 MVVM)来填充下拉列表中的文件夹列表。

View 模型的构造函数使用 SetFolders 方法(私有(private)异步),该方法调用可等待的方法 fileService.GetFoldersAsync() 来获取文件夹列表。然后将文件夹列表分配给名为“FoldersList”的属性。 XAML 使用此属性来使用数据绑定(bind)填充下拉列表。

我想知道有没有更好的方法来设置 FoldersList 属性而不必在构造函数中设置它,如下所示。当实际数据绑定(bind)发生时(不是在类初始化期间),我更愿意调用 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();
}
}

最佳答案

我会将其实现为惰性属性并使用 ObservableCollection<T>而不是 IEnumerable<T> .我们正在几个项目中这样做,并且效果很好。这样,您可以保证仅在需要时才加载数据。此外,如果您需要预取它,您始终可以在构造函数或其他地方调用 load 方法。

作为旁注,我个人不会直接从我的 ViewModel 中公开 IStorageFolder。

private async Task LoadData()
{
if(!IsLoading)
{
IsLoading = true;
Folders = new ObservableCollection<Folder>(await fileService.GetFolderAsync());

}
IsLoading = false;
}

private ObservableCollection<Folder> _folders;

public ObservableCollection<Folder> Folders
{
get
{
if(_folders == null)
{
LoadData();//Don't await...
}
return _folders;

}
private set
{
SetProperty(ref _folders,value);
}

}
private bool _isLoading;
public bool IsLoading
{
get
{
return _isLoading;
}
private set
{
SetProperty(ref _isLoading,value);
}
}

请注意,您可以使用 IsLoading 属性来显示例如进度环。在加载可观察集合之后,您将能够刷新它而无需重新创建它。 (_folders.Add、_folders.Remove、_folders.Clear...)

关于c#-4.0 - 将异步结果分配给数据绑定(bind)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11176349/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com