将异步结果分配给数据绑定属性

2024-04-14

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

View 模型的构造函数使用 SetFolders 方法(私有异步),该方法调用可等待方法 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();
    }
}

我会将其实现为惰性属性并使用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.添加、_folders.删除、_folders.清除...)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将异步结果分配给数据绑定属性 的相关文章

  • 在非异步函数中使用“await”

    我有一个异步函数 它在代码中的某个位置通过 setInterval 运行 该函数定期更新一些缓存 我还有一个不同的同步函数 它需要检索值 最好从缓存中检索 但如果是缓存未命中 则从数据源中检索 我意识到以同步方式进行 IO 操作是不明智的
  • 使用 SQLite.Net.Async 的 Xamarin.Forms

    我已按照此处的说明进行操作http developer xamarin com guides cross platform xamarin forms working with databases http developer xamari
  • 使用await Task.Run()的异步方法永远不会“完成”

    我有一个方法定义为 public async Task SomeAsyncMethod DoSomeStuff await Task Run gt DoSomeSyncStuff DoSomeOtherSyncStuff var someD
  • WinRT 中是否有“IsInDesignMode”属性?

    我正在尝试从 Phone 7 移植我的应用程序 但找不到检测控件何时处于设计模式的方法 知道了 Windows ApplicationModel DesignMode DesignModeEnabled 我正在使用这个 if Microso
  • 在没有 TransactionScopeAsyncFlowOption.Enabled 的情况下启用异步 TransactionScope

    以下是使用事务范围的异步缓存和数据库更新 我无法使用TransactionScopeAsyncFlowOption Enabled在 v 4 5 1 中引入 因为我使用的 Apache Ignite Net 缓存不支持它 我尝试通过捕获当前
  • 午夜的 DateChange 事件[重复]

    这个问题在这里已经有答案了 可能的重复 后台工作人员检查什么时候是午夜 https stackoverflow com questions 3053695 background worker check for when its midni
  • 如何有效地测试action是否用属性(AuthorizeAttribute)修饰?

    我正在使用 MVC 并且有一种情况OnActionExecuting 我需要确定即将执行的Action方法是否用属性修饰 AuthorizeAttribute尤其 我不是问授权是否成功 失败 而是问该方法是否需要授权 对于非 MVC 人员
  • C#4做COM的时候需要调用Marshal.ReleaseComObject吗?

    我有 VS2010 并向我的项目添加了对 COM 库的引用 并且 VS 在项目中嵌入了主要互操作 如果我引用COM库中的对象并且我想快速处理它们而不等待GC 是否需要调用ReleaseComObject Marshal ReleaseCom
  • sandcastle 未解决的装配参考

    我正在尝试使用 sandcastle 帮助文件生成器生成文档 在沙堡中构建项目时 我收到以下错误 MRefBuilder error Unresolved assembly reference Microsoft Owin Microsof
  • 异步 Spring MVC 控制器方法后记录响应正文

    我的 Spring MVC 应用程序中有以下内容 RestController public class SomeController GetMapping value csv produces text csv MediaType APP
  • 如何使用 WinRT 创建经典的 win32 应用程序窗口?

    在 Win32 API 中注册窗口类 创建窗口然后通过消息泵循环保持其活动状态的 C WinRT 等效项是什么 我目前正在查看和阅读 WinRT 的文档 因为我想学习如何以现代 C 方式完成我以前在 Win32 中所做的所有操作 到目前为止
  • 关于WinRT的演讲

    WinRT 中是否提供语音 api 如 Windows Phone 8 我可以使用第三方语音 API 来代替吗 我想在我的 Windows 8 WinRT 应用程序中实现 TTS 有人有建议吗 WinRT 现已支持语音 http msdn
  • 如何实现快捷键的键盘处理程序cefSharp

    我正在构建一个用于浏览网页的 Windows 应用程序cefSharp 我需要在该应用程序中实现一些快捷键 任何人都可以告诉我如何实现此功能 Ex ctrl tab move to next tab 我能够跟踪用户是否按下任何单个键 但无法
  • 等待多个异步调用完成后再继续

    因此 我有一个加载页面 并通过 jquery get 发出多个请求以使用其值填充下拉列表 function LoadCategories Category LoadPositions Position LoadDepartments Dep
  • .NET NewtonSoft JSON反序列化映射到不同的属性名称

    我有以下从外部接收的 JSON 字符串 team v1 attributes eighty min score home or away home score 22 team id 500 v1 attributes eighty min
  • 屏幕键盘显示时调整 winrt 页面大小

    我有一个 Windows 8 1 C 应用程序 它显示一个带有相当大文本框的页面 几乎覆盖整个页面 它是一个书写应用程序 当屏幕键盘出现时 它会覆盖文本框的一半 我想调整文本框 甚至整个页面 的大小 使其不被键盘覆盖 我现在尝试使用静态 I
  • 使用异步工作流程并行化的最佳实践

    假设我想抓取一个网页并提取一些数据 我很可能会写这样的东西 let getAllHyperlinks url string async let req WebRequest Create url let rsp req GetRespons
  • JavaScript 中的 Promise 有什么意义?

    一个承诺是一个 可能现在可用 或将来可用 或永远不可用的值 来源 MDN 假设我有一个想要处理图片的应用程序 图片已加载 例如在算法在后台使用它之后 或某种其他类型的延迟 现在我想检查一下图片是否可以在future 通过使用承诺 而不是回调
  • Android 中 Kotlin 协程的正确使用方式

    我正在尝试使用异步更新适配器内的列表 我可以看到有太多的样板 这是使用 Kotlin 协程的正确方法吗 这个可以进一步优化吗 fun loadListOfMediaInAsync async CommonPool try Long runn
  • 未捕获 Func<> 的异常(异步)

    我有以下代码 为了进行此重现而进行了简化 显然 catch 异常块将包含更多逻辑 我有以下代码 void Main var result ExecuteAction async gt Will contain real async code

随机推荐

  • `scipy.ndimage.zoom` 与 `order=0` 的 `skimage.transform.rescale`

    我正在创建一个彩色灰度图像来显示图像块的分类 我需要使用零阶对低分辨率分类图像进行上采样以匹配原始图像大小 When I use skimage transform rescale I 16 order 0 I get the desire
  • Vue.js $children 按组件名称

    我正在尝试按名字访问特定的孩子 目前 由于孩子所在的位置 我这样称呼孩子 this root children 0 没关系 只要那个孩子总是 0 但如果有一种方法可以做类似的事情那就太好了 this root children detail
  • Expo 应用程序:任何导航器均未处理“TOGGLE_DRAWER”操作

    我试图从 MealsNavigator 导航中显示一个抽屉 到目前为止 我导入了 ff 必需品 import React from react import NavigationContainer from react navigation
  • 将此字符串转换为时间戳 PHP [重复]

    这个问题在这里已经有答案了 我有这个字符串 13 10 15 00 我想将其转换为时间戳 但是当我这样做时 timestamp strtotime 13 10 15 00 它返回一个空值 在你的代码中strtotime 正在尝试转换13 1
  • 从单线程进行 COM 调用会挂起线程

    我有一个应用程序 可以通过自动化插件执行一些 Excel 自动化操作 该加载项是多线程的 所有线程都设法调用 Excel COM 对象 由于 Excel 在进行多次调用时有时会返回 忙 异常 因此我将所有调用包装在 重试 函数中 但我觉得这
  • 如何从 page.open 发出的请求中查看 HTTP 状态代码?

    我有一个 phantomJS 脚本 其中包含以下内容 page open url function status if status fail handle failure 状态检查有时会起作用 但即使请求返回 500 状态仍然是 成功 如
  • 如何使用 jQuery 的 $.ajax() 函数来运行 php 脚本? [复制]

    这个问题在这里已经有答案了 为了使这一点易于理解 我制作了一个示例代码 因为我的实际代码要大得多 基本上我想要完成的是运行我的 PHP 脚本 使用 ajax 编辑 XML 文件 这是因为我需要在我的实际项目中的 javascript 中执行
  • 使用 12 GB 内存运行 Dart

    I am using 16 GB RAM on my Pc This started happening while working without any reason as far as I no This always happens
  • docker compose MySQL 容器 [2002] 连接被拒绝

    我正在尝试为 Nginx PHP Laravel MySQL 构建 docker compose 容器 但我不断收到连接被拒绝错误 docker compose yml version 3 services nginx image ngin
  • Laravel 带有约束的急切加载

    所以我的模型有两个简单的关系 然后急切加载就像这样完美地工作 Entry with author lastModifiedBy gt 但是假设我想添加一个带有约束的新关系 例如 public function foo return this
  • iOS SDK Hue 飞利浦与 Swift

    我尝试在 Objective C 中为 Hue 导入 iOS SDK 我按照这里的说明进行操作 https github com PhilipsHue PhilipsHueSDK iOS OSX https github com Phili
  • 为什么 Camera.setParameters(Camera.Parameters) 不适用于索尼爱立信 X10 和 Droid?

    在索尼爱立信 X10 或 Droid 上使用相机 API 时 有人遇到过奇怪的行为吗 例如 以下代码不适用于这些设备 结果 我在市场上收到了很多负面反馈 导致许多订单被取消 mParameters set rotation orientat
  • 我可以向内置 Python 类型添加自定义方法/属性吗?

    例如 假设我想添加一个helloWorld Python 的 dict 类型的方法 我可以这样做吗 JavaScript 有一个以这种方式运行的原型对象 也许这是糟糕的设计 我应该对 dict 对象进行子类化 但它只适用于子类 我希望它适用
  • 编写每个三角形/面具有纯色的 GLSL 片段着色器的方法

    我有顶点和三角形数据 其中包含每个数据的颜色triangle 面 不是每个顶点 即单个顶点由多个面共享 每个面可能具有不同的颜色 我应该如何在 GLSL 中解决这个问题以获得每个的纯色分配face正在渲染 通过平均顶点相邻多边形的颜色来计算
  • 设置任意深度的嵌套列表样式

    我想知道是否可以仅使用 CSS 来设置嵌套无序列表的样式 而不使用任何脚本 问题是 CSS 需要适用于列表树的任何深度 例如 我有一个列表 ul li Item 1 li li Item 2 li li Item 3 li li class
  • 在 Mocha 中处理未随 npm 安装的依赖项?

    我有一个正在运行的 Node 应用程序 我正在尝试添加 Mocha 测试 但遇到了一些奇怪的导入错误 这是我的文件结构 package json index js src chart js test test chart js 这就是我的c
  • 如何使用灵活的数组成员初始化结构

    我有以下结构 typedef struct person int age char sex char name person 我已经做了一些基本的互联网搜索 但不成功 了解如何创建实例并使用灵活的数组成员初始化结构而不使用malloc 例如
  • snmpwalk 与 PySNMP

    我想重现以下 SNMP 命令的行为 snmpwalk v2c cpublic 192 168 0 10 1 3 6 1 2 1 25 2 3 1 3 这给了我这个输出 iso 3 6 1 2 1 25 2 3 1 3 1 STRING Ph
  • 列出应用程序的活动和意图过滤器?

    我有兴趣激活另一个应用程序的活动 通过阅读 Android SDK 我知道最好以隐式意图执行此操作 但是 此活动并不驻留在我拥有的应用程序中 因此我不知道意图过滤器上的操作 类别和数据标志 如何检查 Android 应用程序元数据 例如活动
  • 将异步结果分配给数据绑定属性

    下面是一个示例实现 它使用 Metro API 和数据绑定 使用 MVVM 来填充下拉列表中的文件夹列表 View 模型的构造函数使用 SetFolders 方法 私有异步 该方法调用可等待方法 fileService GetFolders