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

MAUI中XAML无法访问ObservableCollection内ToDoItem字段的问题求助

问题原因

MAUI的数据绑定仅支持绑定属性(Property),而你的ToDoItem类中所有成员都是字段(Field)(比如public string Title = title;这种写法),所以XAML里的{Binding Title}无法找到对应的数据,导致Title不显示。

另外还有两个次要问题:

  • MainPageViewModel中未定义UpdateCommand和DeleteCommand,按钮点击会无响应
  • 若未给Items集合添加测试数据,列表也会是空的
解决方案

1. 将ToDoItem的字段改为属性

把ToDoItem的字段改成属性,推荐使用CommunityToolkit.Mvvm的ObservableProperty特性(自动实现INotifyPropertyChanged,支持UI自动更新):

using CommunityToolkit.Mvvm.ComponentModel;

public partial class ToDoItem : ObservableObject
{
    [ObservableProperty]
    private Guid _id = Guid.NewGuid();

    [ObservableProperty]
    private DateTime _creationTime = DateTime.Now;

    [ObservableProperty]
    private bool _isDone = false;

    [ObservableProperty]
    private string _title;

    [ObservableProperty]
    private int _priority;

    public ToDoItem(string title, int priority)
    {
        Title = title;
        Priority = priority;
    }
}

如果不想用MVVM工具包,也可以手动定义属性:

public class ToDoItem
{
    public Guid Id { get; set; } = Guid.NewGuid();
    public DateTime CreationTime { get; set; } = DateTime.Now;
    public bool IsDone { get; set; } = false;
    public string Title { get; set; }
    public int Priority { get; set; }

    public ToDoItem(string title, int priority)
    {
        Title = title;
        Priority = priority;
    }
}

2. 在ViewModel中添加命令实现

给MainPageViewModel添加UpdateCommand和DeleteCommand,同样用CommunityToolkit.Mvvm的RelayCommand:

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Collections.ObjectModel;
using System.Linq;

public partial class MainPageViewModel : ObservableObject
{
    [ObservableProperty]
    ObservableCollection<ToDoItem> items = [];

    public MainPageViewModel()
    {
        // 添加测试数据,确保列表有内容
        Items.Add(new ToDoItem("完成MAUI待办列表", 1));
        Items.Add(new ToDoItem("学习数据绑定", 2));
    }

    [RelayCommand]
    private void Update(Guid id)
    {
        var targetItem = Items.FirstOrDefault(item => item.Id == id);
        if (targetItem != null)
        {
            targetItem.IsDone = !targetItem.IsDone;
        }
    }

    [RelayCommand]
    private void Delete(Guid id)
    {
        var targetItem = Items.FirstOrDefault(item => item.Id == id);
        if (targetItem != null)
        {
            Items.Remove(targetItem);
        }
    }
}

注:ViewModel中原来的id、isDone、title、priority字段是多余的,可以删除,因为这些是ToDoItem的属性,不需要在ViewModel中重复定义。

3. 确保BindingContext正确设置

在MainPage的构造函数中设置BindingContext:

public MainPage()
{
    InitializeComponent();
    BindingContext = new MainPageViewModel();
}
验证修改

完成以上修改后,运行项目,你会看到待办事项的Title正常显示,点击Done和Delete按钮也能正常执行对应逻辑。

内容的提问来源于stack exchange,提问作者Behzad Dara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 16:30:35