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

UWP中ListView添加项后不显示的问题求助

解决UWP ListView无法显示新增项的问题

针对你遇到的问题,结合代码分析,给出以下排查和修复步骤:

1. 修复Expense类的构造函数问题

你的Expense类定义中没有带三个参数的构造函数,但在AddExpense_Click事件里使用了new Expense(expenseName, expenseAmount, expenseCategory)实例化对象,这会导致编译错误或运行时异常,最终无法添加有效项到集合中。

修复方式:

  • 给Expense类添加对应构造函数:
public class Expense
{
    public string Name { get; set; }
    public double Amount { get; set; }
    public string Category { get; set; }

    // 添加带参数的构造函数
    public Expense(string name, double amount, string category)
    {
        Name = name;
        Amount = amount;
        Category = category;
    }
}

或者改用对象初始化器(无需修改Expense类):

Expense expense = new Expense
{
    Name = expenseName,
    Amount = expenseAmount,
    Category = expenseCategory
};

2. 确保ViewModel的Expenses属性正确实现通知

虽然ObservableCollection本身会触发集合变更通知,但如果MainPageViewModel中Expenses属性是自动属性且未触发PropertyChanged事件,可能导致x:Bind无法正确关联集合。

优化ViewModel:

public class MainPageViewModel : INotifyPropertyChanged
{
    private ObservableCollection<Expense> _expenses;
    public ObservableCollection<Expense> Expenses
    {
        get => _expenses;
        set
        {
            _expenses = value;
            OnPropertyChanged(nameof(Expenses));
        }
    }

    public MainPageViewModel()
    {
        Expenses = new ObservableCollection<Expense>();
    }

    public void AddExpense(Expense expense)
    {
        Expenses.Add(expense);
    }

    // INotifyPropertyChanged实现
    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

3. 检查ViewModel的实例化与绑定

确保页面的ViewModel属性已正确初始化,且未在运行时被重新赋值:

public sealed partial class MainPage : Page
{
    public MainPageViewModel ViewModel { get; set; }

    public MainPage()
    {
        this.InitializeComponent();
        ViewModel = new MainPageViewModel();
    }

    // 其他代码...
}

4. 避免非UI线程操作集合

如果SaveDataAsync方法中涉及修改Expenses集合的操作,必须确保在UI线程执行:

private async Task SaveDataAsync()
{
    await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        // 此处执行集合修改操作
    });
}

5. 验证x:Bind的模式与拼写

确认ListView的ItemsSource绑定模式为OneWay,且属性名称拼写正确:

<ListView Name="ExpensesView" Margin="10" Header="Expense" ItemsSource="{x:Bind ViewModel.Expenses, Mode=OneWay}">

按照以上步骤排查后,新增的项应该能正常显示在ListView中。

内容的提问来源于stack exchange,提问作者Anton Boyko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:47:58