WP8 LongListSelector - 重新分配 ItemsSource 无效

Posted

技术标签:

【中文标题】WP8 LongListSelector - 重新分配 ItemsSource 无效【英文标题】:WP8 LongListSelector - re-assigning ItemsSource has no effect 【发布时间】:2012-11-19 00:03:47 【问题描述】:

我正在使用新的 Windows Phone 8 LongListSelector 控件,它的 ItemsControl 分配给 List<Group<object>>,如下所示:

    List<Group<PlacePoint>> searchResults; 

    async void doSearch()
    
        this.searchResults = await SearchHelper.Instance.getSearchResults(txtSearchTerm.Text);
        longList.ItemsSource = this.searchResults;
    

不幸的是,我第二次搜索时,重新设置 .ItemsSource 属性没有任何效果,控件只是显示旧的列表。

如何更改绑定?

【问题讨论】:

【参考方案1】:

似乎重新分配 longList.ItemsSource 没有任何效果,无论这是一个错误还是我不能说的设计。

但是,一个简单的解决方法是简单地使用 ObservableCollection>,然后使用此集合而不是重新分配 ItemsSource。

示例代码:

    ObservableCollection<Group<PlacePoint>> searchResults = new ObservableCollection<Group<PlacePoint>>();


    public SearchPage()
    
        InitializeComponent();

        longList.ItemsSource = this.searchResults;
    

    async void doSearch()
    
        List<Group<PlacePoint>> tempResults = await SearchHelper.Instance.getSearchResults(txtSearchTerm.Text);

        // Clear existing collection and re-add new results
        this.searchResults.Clear();
        foreach (Group<PlacePoint> grp in tempResults )
        
            this.searchResults.Add(grp);
        
    

【讨论】:

如果你赞成这个答案,请记得也赞成这个问题!我在网上搜索时找不到这个问题的任何答案。 SearchHelper.Instance 这个怎么弄?我在代码中输入了它,但它显示错误。需要任何扩展吗? SearchHelper 只是一行示例代码,您应该将其替换为您自己的返回 List&lt;Group&lt;YourObject&gt;&gt; 的方法,该方法的其余部分将向您展示如何清除现有集合并重新- 添加您的结果。【参考方案2】:

有时将 ItemsSource 设置为 null ,然后立即设置为您的结果会有所帮助。

【讨论】:

虽然这是正确的,但正确的解决方案是改用 ObservableCollection。 定义“正确的解决方案”。事实是,使用 Observable 集合来删除和重新添加所有项目会引发很多事件,并可能导致巨大的开销。简单地清除整个 itemssource 以触发完全刷新并在之后设置新的 itemssource 通常更便宜。如果您真的想讨论“正确的解决方案”,我们正在讨论修复 WinPhone 中的错误,因此您根本不必做所有这些,而只需设置新的 itemssource。但这不起作用,所以让我们专注于最简单和最便宜的>解决方法<.> Silverlight 和 WPF 还要求将 ItemsSource 显式设为 null。真正的开销在于渲染,而不是触发 CLR 事件。通过重置 ItemsSource,您可能会失去虚拟化。 @dotMorten 知道这是否也解决了 Windows Phone 中的问题?【参考方案3】:

您需要使用 async 定义您的 doSearch() 方法,以便 await 正常运行。

尝试像这样声明你的方法:

private async Task doSearch() 


【讨论】:

我很确定 await 调用不会在非 async 函数中编译 - 也许他只是忘了把 异步这里... 我确实忘记了,感谢您的提醒 - 这会更好地作为对原始问题的评论而不是建议的答案。\

以上是关于WP8 LongListSelector - 重新分配 ItemsSource 无效的主要内容,如果未能解决你的问题,请参考以下文章

UWP&WP8.1 重新绘制图片 WriteableBitmap用法 图片转byte[]数组,byte[]数组转图片

用于 Xamarin.Forms 的带有标头 (LongListSelector) 的 ListView

LongListSelector和上下文菜单

LongListSelector SelectedItem 为 Null

如何在 windows phone 7 中禁用 LongListSelector 中的滚动视图

Xamarin 中的 WP8.1