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

时间:2015-11-21 21:40:11

标签: c# wpf mvvm mongodb-.net-driver bson

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

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

然后引导我检查我如何将数据映射到模型。

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

这表明正在返回所有数据,但所有模型字段都为空。而是创建一组客户,并在不同的客户对象中填充字段。

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

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

step 1

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

step 2

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

http://hastebin.com/ipatatoqif.pl

CustomerModel:

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:

Orders data grid

1 个答案:

答案 0 :(得分:1)

我不会直接在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