【问题标题】:WP8 LongListSelector - re-assigning ItemsSource has no effectWP8 LongListSelector - 重新分配 ItemsSource 无效
【发布时间】: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 属性没有任何效果,控件只是显示旧的列表。

如何更改绑定?

【问题讨论】:

    标签: c# xaml windows-phone windows-phone-8


    【解决方案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 函数中编译 - 也许他只是忘了把 异步这里...
    • 我确实忘记了,感谢您的提醒 - 这会更好地作为对原始问题的评论而不是建议的答案。\
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多