在属性setter中将join转换为ObservableCollection返回空列表

时间:2014-03-28 09:24:26

标签: c# wpf linq entity-framework observablecollection

我在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生成的查询是正确的。

当我在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

1 个答案:

答案 0 :(得分:0)

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

如果您不重新分配ObservableCollection但仅使用单个实例,则UI将根据对此实例所做的更改进行更新,以解释您遇到的行为。