在属性设置器中将join转换为ObservableCollection返回空列表

本文关键字:ObservableCollection 返回 列表 转换 join 设置 属性 | 更新日期: 2023-09-27 17:54:36

我在LINQObservableCollection中遇到了一个奇怪的行为。

我有一个LINQ查询,获取我的Users与他们分配的Roles。这个查询的left outer join是正确的。

context.Users.Select(x => new UserModel()
             {
                 UserID = x.UserID,
                 Username = x.Username,
                 AssignedRoles = x.UserRoles.Select(y => new RoleModel()
                 {
                     RoleID = y.RoleID,
                 }).ToList()
             }));

使用此LINQ statement生成的查询是正确的。

当我在User模型中编辑AssignedRoles属性的setter时,会发生奇怪的行为。当我将正确获取的AssignedRoles直接分配给我的属性时,正确的结果将显示在我的UI中。

public ICollection<RoleModel> AssignedRoles
{
    get
    {
        return this.assignedRoles;
    }
    set
    {
        this.assignedRoles = value;
    }
}

但是当我将获取的值转换为ObservableCollection时,列表保持空。

public ICollection<RoleModel> AssignedRoles
{
    get
    {
        return this.assignedRoles;
    }
    set
    {
        this.assignedRoles = new ObservableCollection<RoleModel>(value);
    }
}
谁能给我解释一下为什么会这样?

我知道我可以将AssignedRoles转换为ObservableCollection并保持正确的结果,如:

public ICollection<RoleModel> AssignedRoles
{
    get
    {
        if (!(this.assignedRoles is ObservableCollection<RoleModel>))
            this.assignedRoles = new ObservableCollection<RoleModel>(this.assignedRoles);
        return this.assignedRoles;
    }
    set
    {
        this.assignedRoles = value;
    }
}

但这看起来有点奇怪。

编辑

我猜它与LINQ和它的延迟执行有关?我通过检索结果作为anonymous object解决了这个问题。然后我迭代结果并创建我的UserModel

谢谢!Loetn

在属性设置器中将join转换为ObservableCollection返回空列表

似乎当AssignedRoles更新时,您不会引发INotifyPropertyChanged.PropertyChanged事件。涉及此属性的任何数据绑定都不会更新,因为没有关于属性值更改的通知。

如果你不重新分配ObservableCollection,但只使用一个实例,那么UI将根据对该实例的更改进行更新,解释你所经历的行为。