c# - 延迟加载不可见元素

标签 c# wpf xaml silverlight visibility

我有一个案例,我有一个 gridview/listbox/any type of items control 并且绑定(bind)到控件的项目数量很大(很容易在 5000 左右+ 标记)。

这些项目中的每一个都需要具有从各种网络服务加载的各种属性。显然,使用 Web 服务来同时处理这么多元素是不可能的。

我的问题是,是否可以推迟加载直到这些项目实际显示给用户?例如,用户向下滚动,虽然项目一直存在于集合中,但只有在实际物理呈现时才会处理它们。

我以前看过,但我不记得具体在哪里了。在这种情况下,许多股票报价都在绑定(bind)到 gridview 的集合中,但它们的属性(价格等...)在第一次显示(通过滚动到它们各自的位置)之前是空的。

希望这(有些)有意义。

关于如何实现它有什么想法吗?

最佳答案

我会尝试结合延迟加载和异步加载:
使用虚拟化列表控件。为您的项目创建一个 ViewModel 并使用 ViewModel 的实例填充您的列表(每行一个)。

在您的 ViewModel 中,创建具有默认值的属性,向用户显示数据尚未加载。第一次访问其中一个属性时,触发异步加载数据并在接收到真实数据时触发 INotifyPropertyChanged

这会给用户带来良好的体验,大部分棘手的工作将通过虚拟化列表完成(在 WPF 中,这是 ListBoxListView数据网格...)。希望这对您有所帮助。

class LineItemVM : INotifyPropertyChanged{

  bool   m_loadingTriggered;
  string m_name="Loading...";
  string m_anotherProperty="Loading...";


  public string Name{
     get{
       TriggerLoadIfNecessary(); // Checks if data must be loaded
       return m_name;
     }
  }

  public string AnotherProperty{
     get{
       TriggerLoadIfNecessary(); // Checks if data must be loaded
       return m_anotherProperty;
     }
  }


  void TriggerLoadIfNecessary(){        
     if(!m_loadingTriggered){
       m_loadingTriggered=true;

       // This block will called before your item will be displayed
       //  Due to the m_loadingTriggered-member it is called only once.
       // Start here the asynchronous loading of the data
       // In virtualizing lists, this block is only called if the item
       //  will be visible to the user (he scrolls to this item)

       LoadAsync();
     }
  }

  ...

附加逻辑 作为一个想法,您还可以制作一个外部异步加载线程,在后台加载所有数据,但有一个应该以更高优先级加载的项目列表。这个概念与上面的示例相同,但是 TriggerLoadIfNecessary 方法不是从您的 ViewModel 项目加载数据,而是仅将项目添加到高优先级列表中,以便潜在的可见元素首先加载。哪个版本更适合的问题取决于列表的用途。如果用户很可能使用完整列表并且不会快速导航离开,则此扩展版本更好。否则原始版本可能更好。

关于c# - 延迟加载不可见元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5599552/

相关文章:

javascript - 在 asp.net 中,Ajax 返回数据表总是出现错误部分

c# - 如何创建一个全零元素的 Guid?

c# - 在 WindowsFormsHost 中插入表单时出现 ArgumentException

c# - gridview WPF 中的按钮样式

c# - 使用自定义属性 XAML WPF 动态设置内容属性

c# - MVVM WPF Datagrid TemplateColumn 组合框所选项目不起作用

c# - 线程化对象中包含的方法 - C#

c# - 如何从数据库读取特定文本框为文本框背景颜色着色

asp.net - WPF 浏览器应用程序可以用作 ASP.NET 的替代品吗?

xaml - 本地化 UWP 中 XAML UI 中的字符串