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
相关产品推荐
相关产品推荐

