【问题标题】:Clearing ISupportIncrementalLoading清除 ISupportIncrementalLoading
【发布时间】:2012-10-05 19:46:43
【问题描述】:

我在 Windows 8 Style App 中创建了一个搜索页面。我已经实现了 ISupportIncrementalLoading,当用户滚动分页时效果很好。

我遇到的问题是用户进行第二次搜索时。我显然不知道如何让 LoadMoreItemsAsync 再次触发。我尝试了以下方法:

1) 清除 Observable 且支持 ISupportIncrementalLoading 的底层集合。这会清除屏幕上的所有项目,因此我知道它已正确绑定。

2) 完全替换实现 ISupportIncrementalLoading 并引发 INotifyPropertyChanged 的​​底层集合实例,以便视图知道属性已更改。这也会清除屏幕上的所有项目。

但是,LoadMoreItemsAsync 不想在清除或替换基础集合实例后触发。我的预感是 UI 认为它不需要再加载了,但是因为我已经清除了所有它应该想要加载更多的项目。

我已验证 HasMoreItems 属性设置为 true。

如果它有帮助,很遗憾,如果您从 Windows 8 商店下载 FlixPicks,您会在生产中看到错误。重现的步骤是:

  1. 使用 Windows 搜索合同进行搜索
  2. 通知分页工作从搜索页面
  3. 再次搜索。
  4. 请注意,所有项目都已清除。 (此时 LoadMoreItemsAsync 没有触发)

感谢您提供的任何建议!

【问题讨论】:

  • 我刚刚创建了一个似乎工作正常的复制品。这很简单,所以可能在那里丢失了一些东西。你能看一下并尝试看看有什么不同吗? box.com/s/ddr8138khigwe6n78i4b
  • 嗨,Shahar,非常感谢您提供的示例。您的样品确实工作得很好。我已经对其进行了一些调整,使其不再起作用。我使用的是 GridView 而不是列表视图,并且我调整了每个项目的宽度。如果您好心,您可以看看调整后的代码库。为了重现你根本不滚动你必须一直向左然后点击开关或清除。如果您完全向右滚动,它就可以工作。 box.com/s/9oe4miksi4yeyhat6rwo 再次感谢!

标签: windows-8 microsoft-metro


【解决方案1】:

我正在重新提出一个老问题,但是当以前的答案都不适合我时,我找到了解决方案。

myCollection = new MyIncrementalLoadingCollection();
myListView.ItemSource = myCollection; //This is what I was missing!

因为我希望每次导航到页面时都刷新列表视图,所以这是我的最终结果。

protected override async void OnNavigatedTo(NavigationEventArgs e) {
    _logItems = new CommandLogIncrementalLoadingCollection();
    logListBox.ItemsSource = _logItems;
}

【讨论】:

    【解决方案2】:

    我知道这是一个较老的问题,但我也遇到过它,并认为其他人可能会从 MVVM 方法中受益来解决它。我的解决方法是,在重置集合后,将单个项目加载到集合中。

    private async Task ResetCollectionAsync()
    {
        Clear();
        await LoadMoreItemsAsync(1);
    }
    

    集合被清空并重新添加单个项目。 GridView/ListView 控件检测到CollectionChanged 事件并重新查询HasMoreItems 以确定是否加载附加数据。

    此行为已融入IncrementalLoadingCollection (v1.0.1),它还支持开箱即用的过滤和排序功能。

    【讨论】:

      【解决方案3】:

      这绝对看起来像一个错误。要解决此问题,请在重置您的收藏后添加以下行(在任何情况下):

      gv.LoadMoreItemsAsync();
      

      您可能可以从控件继承并创建一些自动执行此操作的覆盖:

      【讨论】:

      • 谢谢。从技术上讲,这可行,但在使用 ViewModel 时会造成混乱,因为我无法直接访问绑定到集合的两个控件。我暂时破解了它。我将一个 Action 传递给我的 ViewModel,它在视图模型中被调用,然后 Action 可以访问控件。我还不得不处理另一个问题。在某些情况下,我遇到了例外。好像是时间问题。现在,我只等待 1 秒钟,如果还没有结果,我会强制调用 LoadMoreItemsAsync。我在它周围添加了重试逻辑,以防 1 秒还不够。呃。
      • 其中一个“我需要淋浴”修复。将其固定在控件中可能会更好。我会在/如果有时间的时候研究一下,然后把它放在我的博客/这里。
      猜你喜欢
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      相关资源
      最近更新 更多