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

MAUI CollectionView:绑定模型内集合属性后如何刷新列表?

解决MAUI中CollectionView不刷新角色列表的问题

问题根源

你使用的List<Role>未实现集合变更通知接口(INotifyCollectionChanged),因此向集合添加/删除元素时,UI无法感知到变化,导致CollectionView不会自动刷新。

解决方案

将User类中的Roles集合类型替换为ObservableCollection<Role>,这是MAUI专为数据绑定设计的集合类型,内置了元素变更通知能力。

修改User类代码

using System.Collections.ObjectModel; // 需引入该命名空间

public class User
{
    public int Id { get; set; }
    public required string LoginName { get; set; }
    public required string FullName { get; set; }
    public required string Email { get; set; }
    public required string PasswordHash { get; set; }
    public bool Active { get; set; } = true;
    [NotMapped]
    public ObservableCollection<Role> Roles { get; set; } = new ObservableCollection<Role>(); // 替换为ObservableCollection并初始化
}

额外注意事项

  • 必须初始化Roles集合:上述代码直接在属性声明时完成初始化,避免因集合为null导致绑定失败。
  • 如果需要从已有List<Role>转换为ObservableCollection,可在构造函数或初始化逻辑中处理:
    // 示例:从现有List转换
    public User(List<Role> existingRoles)
    {
        Roles = new ObservableCollection<Role>(existingRoles);
    }
    

无法修改User类的替代方案

若因业务限制不能修改User类的集合类型,可在ViewModel中维护独立的ObservableCollection<Role>并绑定:

  1. 在ViewModel中添加属性:
public ObservableCollection<Role> UserRoles { get; } = new ObservableCollection<Role>();
  1. 初始化时同步数据:
// 假设User对象已完成初始化
foreach (var role in User.Roles)
{
    UserRoles.Add(role);
}
  1. 修改XAML绑定目标:
<CollectionView ItemsSource="{Binding UserRoles}"
                SelectionMode="Single">
    <!-- 原有模板代码保持不变 -->
</CollectionView>
  1. 后续添加角色时,直接操作UserRoles并同步原集合:
var newRole = new Role { Name = "新角色" };
UserRoles.Add(newRole);
User.Roles.Add(newRole); // 同步到User原集合

内容的提问来源于stack exchange,提问作者Branko Gojković

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:22:44