You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP中如何将ListView选中项添加至全局数组

解决UWP程序中添加选中项后重复显示的问题

嘿,别担心!作为编程新手遇到这种问题太正常了,我帮你一步步分析和解决~

问题根源分析

你提到跳转后重复显示最后一次选中的项20次,大概率是踩了下面这两个常见的新手坑:

  1. 循环错误地重复添加同一个对象引用:如果你的for循环里只是把ListView.SelectedItem直接重复添加20次,那全局数组里的所有元素其实都是指向同一个对象的内存引用——看起来是20个项,但本质上是同一个东西,显示自然全是一样的。
  2. 没有创建对象的副本:就算你需要添加多个相同的食物,也不能直接复用同一个选中对象的引用,否则后续如果修改这个对象的属性(比如数量),数组里的所有项都会跟着变。

具体修正方案

先看你可能写错的代码示例(大概是这样):

// 假设你的全局数组是静态的
public static List<FoodModel> GlobalOrderList = new List<FoodModel>();

// 添加按钮的点击事件
private void AddToOrderBtn_Click(object sender, RoutedEventArgs e)
{
    // 错误:循环20次添加同一个选中项的引用
    for (int i = 0; i < 20; i++)
    {
        var selectedFood = FoodListView.SelectedItem as FoodModel;
        GlobalOrderList.Add(selectedFood);
    }
    // 跳转到订单页面
    Frame.Navigate(typeof(OrderPage));
}

修正1:只添加一次选中项(如果不需要20次)

如果你的需求是点击一次按钮添加一个选中的食物,那直接去掉多余的for循环就行,还要加个空值判断避免报错:

private void AddToOrderBtn_Click(object sender, RoutedEventArgs e)
{
    var selectedFood = FoodListView.SelectedItem as FoodModel;
    if (selectedFood != null) // 先确认有选中项
    {
        // 如果后续不需要修改这个食物的属性,直接添加即可
        GlobalOrderList.Add(selectedFood);
        // 如果需要修改(比如加数量),一定要创建副本!
        // 比如给FoodModel加一个克隆方法:
        // var foodCopy = selectedFood.Clone();
        // GlobalOrderList.Add(foodCopy);
    }
    Frame.Navigate(typeof(OrderPage));
}

修正2:需要添加多个相同食物时,创建对象副本

如果确实需要添加20份相同的食物,必须为每一份创建新的对象实例,而不是重复加同一个引用。你可以给你的食物类实现一个克隆方法:

// 你的食物模型类
public class FoodModel
{
    public string Name { get; set; }
    public double Price { get; set; }
    public int Count { get; set; }

    // 实现克隆方法,创建新的对象实例
    public FoodModel Clone()
    {
        return new FoodModel
        {
            Name = this.Name,
            Price = this.Price,
            Count = this.Count
        };
    }
}

// 然后修改添加按钮的代码
private void AddToOrderBtn_Click(object sender, RoutedEventArgs e)
{
    var selectedFood = FoodListView.SelectedItem as FoodModel;
    if (selectedFood != null)
    {
        // 循环20次,每次添加一个新的副本
        for (int i = 0; i < 20; i++)
        {
            var foodCopy = selectedFood.Clone();
            GlobalOrderList.Add(foodCopy);
        }
    }
    Frame.Navigate(typeof(OrderPage));
}

额外注意事项

  • 全局数组的生命周期:如果是静态全局数组,记得在合适的时机清空(比如用户完成下单后),避免下次打开订单页面还残留之前的内容。
  • 空值判断:永远要检查ListView.SelectedItem是不是null,防止用户没选中任何项就点击按钮导致报错。

内容的提问来源于stack exchange,提问作者Cameron Dyas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:17:56