如何将 Observable Collection 上的空数据解析为数据网格绑定?

How to resolve null data on Observable Collection to data grid binding?

我在 MongoLab 上建立了一个数据库,它被查询并解析为一个模型。该模型中的集合又绑定到数据网格。但是当我查询数据库时,网格上显示的唯一数据是文档的对象 ID。

为了调试问题,我用每个字段的常量数据初始化了列表,并且绑定有效,填充了网格上的每个字段。

这让我检查如何将数据映射到模型。

然后我逐步查看从服务器查询返回的 Observable 集合的内容。

这表明正在返回所有数据,但所有模型字段均为空。相反,会创建一个客户数组,并在单独的客户对象中填充字段。

有谁知道我该如何进一步调试它?

首先我检查了从查询返回的集合的内容。其中显示了空模型字段和客户数组:

然后我检查了 customers 客户数组的内容(已填充):

文档 JSON 在 MongoLab 中定义,然后映射到应用程序 CustomerModel 中的 CustomerCollection:

http://hastebin.com/ipatatoqif.pl

客户模型:

public class CustomerModel : INotifyPropertyChanged
{

    private ObjectId id;
    private string firstName;
    private string lastName;
    private string email;

    [BsonElement]
    ObservableCollection<CustomerModel> customers { get; set; }


    /// <summary>
    /// This attribute is used to map the Id property to the ObjectId in the collection
    /// </summary>
    [BsonId]
    public ObjectId Id 
    {
        get
        {
            return id;
        }
        set
        {

            id = value;
        }
    }

    [BsonElement("firstName")]
    public string FirstName
    {
        get
        {
            return firstName;
        }
        set
        {
            firstName = value;
            RaisePropertyChanged("FirstName");
        }
    }

    [BsonElement("lastName")]
    public string LastName
    {
        get
        {
            return lastName;
        }
        set
        {
            lastName = value;
            RaisePropertyChanged("LastName");
        }
    }

    [BsonElement("email")]
    public string Email
    {
        get
        {
            return email;
        }
        set
        {
            email = value;
            RaisePropertyChanged("Email");
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

这是网格上显示的数据,目前只有ObjectID:

我不会直接在 MongoDB 中存储 ObservableCollection<T>

相反,我会在 MongoDB 中存储一个 List<T>

为什么? ObservableCollection<T> 是特定于 WPF 的数据结构,除非您 write a custom serializer.

否则可能无法与 MongoDB 一起使用

如果您使用的是 MVVM,则需要将存储在 MongoDB 中的数据与 ViewModel 分开。我建议从 MongoDB 检索数据,然后使用 AutoMapperExpressMapper.

等映射器将其映射到您的 ViewModel

参见another person who ran into the same problem