向列表中添加项目<>对于已经包含数据的对象,在List中添加重复项

本文关键字:添加 对象 数据 List 项目 列表 包含 | 更新日期: 2023-09-27 17:53:07

我正在开发一个Windows phone应用程序,我想从我的web服务中获得前15个对象的列表,加上一个额外的项目来表示"加载下一个15个项目按钮",并将其绑定到一个列表框。在选择最后一个元素或索引(按钮)时,我想从列表中删除最后一个项目(按钮),并再次调用服务以获得接下来的15个项目加上按钮项目,这将再次加到当前列表中,而不清除列表。当我们从列表框中选择最后一项时,同样的过程继续进行。我的问题是我能在第一轮得到正确的答案。在第二轮中,下一个15元素被添加到列表中两次。我不知道真正的问题是什么。我也没有得到任何错误或异常。

到目前为止我所做的是:

private void ListBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        int LastIndex=app.imgItem.Count - 1;
        if (ListBox1.SelectedIndex == LastIndex)
        {
            app.imgItem.Remove(app.imgItem[app.imgItem.Count-1]);
            proxy.SelectNextItemsCompleted += new EventHandler<ServiceReference1.SelectNextItemsCompletedEventArgs>(proxy_SelectNextItemsCompleted);
            int id = app.imgItem.Last().Id;
            proxy.SelectNextItemsAsync(categoryID, id);
        }
    }
void proxy_SelectNextItemsCompleted(object sender, ServiceReference1.SelectNextItemsCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            MessageBox.Show("Cannot load data.");
            return;
        }
        else
        {
                foreach (var item in e.Result)
                {
                    ImgData idata = new ImgData();
                    idata.CategoryID = item.CategoryID;
                    idata.ImageID = item.ImageID;
                    idata.ImageTitle = item.ImageTitle;
                    idata.Thumbnail = item.Thumbnail;
                    app.imgItem.Add(idata);
                }
        }
        ImageData btnData = new ImageData();
        btnData.CategoryID = 0;
        btnData.ImageID = 0;
        btnData.ImageTitle = "";
        btnData.Thumbnail = "Images/loadButton.jpg";
        app.imgItem.Add(btnData);
        ListBox1.ItemsSource = app.imgItem;
    }

向列表中添加项目<>对于已经包含数据的对象,在List中添加重复项

看起来您在SelectionChanged事件处理程序中重新注册了一个事件处理程序,因此,SelectNextItemsCompleted处理程序可能会在第二次调用两次:

proxy.SelectNextItemsCompleted += new EventHandler<ServiceReference1.SelectNextItemsCompletedEventArgs>(proxy_SelectNextItemsCompleted);

您可能应该在代码只运行一次的其他地方注册该事件处理程序。