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<Group<YourObject>>
的方法,该方法的其余部分将向您展示如何清除现有集合并重新- 添加您的结果。【参考方案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 SelectedItem 为 Null