C# 在wp8上将listbox绑定到localdb结果的最佳方法

C# 在wp8上将listbox绑定到localdb结果的最佳方法,c#,windows-phone-8,listbox,C#,Windows Phone 8,Listbox,我有一个WP8应用程序,我在本地数据库中有一些项目。就这个问题而言,我有两个实体——文件夹和文件。我想在带有自定义数据模板的列表框中显示这些数据。 我从localdb中选择项,创建一个modeltype的observablecollection,它包装两个实体模型以进行统一表示,然后将其绑定到listbox。这种方法适用于中等数量的结果,例如多达1000项。 但是,对于较大的列表,例如10K项,我会出现内存不足异常 除此之外,即使对于1k,性能也显然不是很好,因为算法基本上是为获取的每个实体创建

我有一个WP8应用程序,我在本地数据库中有一些项目。就这个问题而言,我有两个实体——文件夹和文件。我想在带有自定义数据模板的列表框中显示这些数据。 我从localdb中选择项,创建一个modeltype的observablecollection,它包装两个实体模型以进行统一表示,然后将其绑定到listbox。这种方法适用于中等数量的结果,例如多达1000项。 但是,对于较大的列表,例如10K项,我会出现内存不足异常

除此之外,即使对于1k,性能也显然不是很好,因为算法基本上是为获取的每个实体创建一个新模型

是否有任何方法可以像NSFetchedResultsController一样将列表框直接绑定到查询结果? 按照评论中的建议进行更新,我尝试按需加载数据。然而,由于listbox没有虚拟化,通过将800个项目添加到可观察的集合i,将它们加载到listbox中,最终得到的退出代码是-2147220978 0x8004020e,这表明图形数据只是过载了可用资源。所以我写了一些代码,在向下滚动时从可观察的集合中删除顶部的项目,一切都很好。然而,试图检测用户何时向上滚动会破坏一切。向下滚动时,我使用linq来显示树,抓住ScrollViewer并检查VerticalOffset是否大于等于ScrollableHeight。但是当检查用户是否滚动到顶部时,我必须检查VerticalOffset==0.0,但是如果用户已经在顶部,即使添加了我的项目,我使用的DependencyPropertyListener也不会引发任何事件。。 e、 g:


对于大数据,您需要使用增量加载或分页加载。@MatDev8,那么,有什么简单的方法可以检测到用户向下滚动列表中的一些项目?e、 g.我不想向用户显示“第1-2页”控件;我很高兴在他们滚动的时候递增加载。你可以看看这个例子=>。在Windows8中,它非常简单,您不必做任何工作来检测用户是否向下滚动。我认为您可以找到wp8的解决方案。@MatDev8,这个例子是针对LongListSelector的,它需要覆盖WrapPanel的模板,然后WrapPanel显然不支持虚拟化。无论如何,事实证明,我可以在向下滚动时增量加载,但向上滚动很难。。。
  var scrollViewer = (ScrollViewer)CurrentItemTiles.Descendants<ScrollViewer>().FirstOrDefault();
  var listener = new DependencyPropertyListener();
  listener.Changed += delegate(object o, BindingChangedEventArgs args)
    {
      if (scrollViewer.VerticalOffset >= scrollViewer.ScrollableHeight)
      { // scrolling down. This works well even when the user keeps holding the scroll bar down, e.g. scrolls through all pages.
        LoadItems(Page + 1);
        if (CurrentItems.Count > 200)
        {
          for (int i = 0; i <= 50; i++)
          {
           CurrentItems.RemoveAt(i);
          }
        }
      }
      else if (scrollViewer.VerticalOffset == 0.0 && Page > 4)
      { 
// This works well when the user is down below and they scroll up. 
// If they want to keep going UP, they have to scroll down a little, then up again, 
// and again and again. This doesnt feel natural at all.
        var count = CurrentItems.Count - 1;
// second argument signifies that we will add items to the top of ObservableCollection<TModel>
        LoadItems(Page - 4, true); 
        for (int i = 0; i <= 50; i++)
        {
          if (CurrentItems.Count >= (count + i)) CurrentItems.RemoveAt(count + i);
        }
      }
    };
  var binding = new Binding("VerticalOffset") { Source = scrollViewer };
  listener.Attach(scrollViewer, binding);