我在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
生成的查询是正确的。
当我在AssignedRoles
模型中编辑User
属性的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
答案 0 :(得分:0)
似乎在更新AssignedRoles
时,您不会引发INotifyPropertyChanged.PropertyChanged
事件。涉及此属性的任何数据绑定都不会更新,因为没有关于属性值更改的通知。
如果您不重新分配ObservableCollection
但仅使用单个实例,则UI将根据对此实例所做的更改进行更新,以解释您遇到的行为。