gpt4 book ai didi

WPF/MVVM/EF - 如何绑定(bind)到实体的相关实体?

转载 作者:行者123 更新时间:2023-12-03 10:58:09 25 4
gpt4 key购买 nike

我有一个与用户实体相对应的详细 View 。每个用户实体都有一个或多个评论实体,在详细 View 上以网格表示。

Detail view with grid

所以遵循 EF 约定,用户模型有一个 UserComments 成员来表示关系:

public partial class User
{
public int UserID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual ICollection<UserComments> UserComments { get; set; }
//....
}

当需要在用户详细信息 View 中创建用户评论网格时,我意识到网格没有正确绑定(bind)到 ICollection(无法向网格添加新行)。经过一番挖掘,我发现我需要使用 ObservervableColletion。好的,所以我将 ICollection 转换为 ObserverableCollection ....
public class UserDetailViewModel
{

public virtual User UserData { get; set; }
private ObservableCollection<UserComments> _UserComments;

public ObservableCollection<UserComment> UserComments {
get { return _UserComments; }
}

public void Load(int UserID)
{
this.UserData = UserRepo.Find(UserID);
this._UserComments = new ObservableCollection<UserComment>(UserData.UserComments);
}

}

凉爽的。我现在可以将行添加到网格中。但...

在这一点上,我意识到我已经通过将 User.UserComments 转换为 ObservableCollection 丢失了 EF 更改跟踪,并且没有简单的方法将修改后的/新的评论返回到 EF 中。

那么我是不是把这一切都搞错了?有没有更好的方法来更新相关数据?

最佳答案

为了让 EF 跟踪集合更改,您需要在模型本身的集合中添加和删除。

this._UserComments = new ObservableCollection<UserComment>(UserData.UserComments);


在上面的行中,您正在通过 copying elements 创建一个集合,因此当向 UserDetailViewModel.UserComments 添加或删除项目时,这些项目实际上并没有被添加到 User.UserComments 或从其中删除。

解决此问题的一些选项包括:
  • User.UserComments 本身更改为 ObservableCollection 并将其暴露在 View 模型中。例如:
    public class UserDetailViewModel
    {
    public virtual User UserData { get; set; }

    public ObservableCollection<UserComment> UserComments
    {
    get { return UserData.UserComments; }
    }

    // other stuff...
    }
  • 处理 UserDetailViewModel.UserComments 的添加/删除事件并在那里修改 User.UserComments 集合。

  • 这也可能会有所帮助:
    https://msdn.microsoft.com/en-us/data/jj574514.aspx

    关于WPF/MVVM/EF - 如何绑定(bind)到实体的相关实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32639144/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com