gpt4 book ai didi

wpf - MVVM 模型中的非阻塞延迟加载属性

转载 作者:行者123 更新时间:2023-12-04 01:08:40 25 4
gpt4 key购买 nike

我对 MVVM 相当陌生,所以如果这个问题有一个众所周知的解决方案,请原谅。

我们正在构建一堆模型类,它们具有预先加载的一些核心属性,以及一些可以通过进行 Web API 调用按需延迟加载的附加属性(更新:澄清一下,这将是一个每个延迟加载的属性的 Web API 调用)。

与其拥有多个模型,不如在其中拥有一个具有延迟加载逻辑的模型似乎是明智的。但是,似乎延迟加载的属性在访问时不应该阻塞,因此当 View 绑定(bind)到 ViewModel 并绑定(bind)到 Model 时,我们不会阻塞 UI 线程。

因此,我正在考虑一种模式,类似于当访问模型上的惰性属性时,它开始异步获取,然后立即返回默认值(例如 null )。当异步获取完成时,它将引发 PropertyChanged事件,以便 ViewModel/View 可以重新绑定(bind)到获取的值。

我已经尝试过了,它似乎工作得很好,但想知道:

  • 这种方法是否存在我尚未发现但会随着应用程序复杂性增加而遇到的任何陷阱?
  • 是否有针对该问题的现有解决方案,要么内置于框架中,要么被广泛用作 3rd 方框架的一部分?
  • 最佳答案

    我过去做过类似的事情,而我一直忘记的一件事是你不能通过任何类型的代码调用你的异步属性并期望它有一个值。

    因此,如果我延迟加载 Customer.Products 的列表, 我无法引用 Customer.Products.Count在代码隐藏中,因为第一次调用它的值为 NULL 或 0 (取决于我是否创建空白集合)

    除此之外,它对绑定(bind)非常有用。我使用的是 Async CTP用于进行异步调用的库,我发现它非常适合这样的事情。

    public ObservableCollection<Products> Products
    {
    get
    {
    if (_products == null)
    LoadProductsAsync();

    return _products;
    }
    set { ... }
    }

    private async void LoadProductsAsync()
    {
    Products = await DAL.LoadProducts(CustomerId);
    }

    更新

    我记得我遇到的另一件事是实际上为 NULL 的数据。如果 Customer.Products 实际上从服务器返回了一个 NULL 值,我需要知道异步方法已正确运行并且实际值为 null,以便它不会重新运行异步方法。

    如果有人在第一次异步调用完成之前第二次调用 Get 方法,我也不希望异步方法运行两次。

    我当时通过 Is[AsyncPropertyName]Loading/ed 解决了这个问题每个异步属性的属性,并在第一次异步调用期间将其设置为 true,但我对必须为所有异步属性创建额外的属性并不满意。

    关于wpf - MVVM 模型中的非阻塞延迟加载属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6522414/

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