在属性设置器中将join转换为ObservableCollection返回空列表
本文关键字:ObservableCollection 返回 列表 转换 join 设置 属性 | 更新日期: 2023-09-27 17:54:36
我在LINQ
和ObservableCollection
中遇到了一个奇怪的行为。
我有一个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
似乎当AssignedRoles
更新时,您不会引发INotifyPropertyChanged.PropertyChanged
事件。涉及此属性的任何数据绑定都不会更新,因为没有关于属性值更改的通知。
如果你不重新分配ObservableCollection
,但只使用一个实例,那么UI将根据对该实例的更改进行更新,解释你所经历的行为。