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

时间:2015-09-17 20:10:58

标签: wpf entity-framework mvvm ef-code-first devexpress-wpf

我有一个与用户实体对应的详细视图。每个用户实体都有一个或多个注释实体,它们在详细视图中表示为网格。

Detail view with grid

因此,遵循EF约定,用户模型具有UserComments成员来表示关系:

#include <locale> 

std::wstring line;
while (std::getline(iss, line, L';'))
{
    std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> conv;
    std::string str = conv.to_bytes(line);

    // use str as needed...
    MessageBoxW(0, line.c_str(), L"line", 0);
    MessageBoxA(0, str.c_str(), "str", 0);
}

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

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; }
    //....
}

冷却。我现在可以在网格中添加行。但...

此时,我已经意识到我已经通过将User.UserComments转换为ObservableCollection来丢失EF更改跟踪,并且没有简单的方法可以将修改后的/新注释转回EF。

所以我接近这一切都错了吗?有更好的方法来更新相关数据吗?

1 个答案:

答案 0 :(得分:3)

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

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

在上面一行中,您需要copying elements创建一个集合,因此当在UserDetailViewModel.UserComments添加或删除项目时,这些项目实际上并未添加到或已从User.UserComments移除。

解决此问题的一些选项包括:

  • User.UserComments本身更改为ObservableCollection并在视图模型中公开它。例如:

    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