Как разрешить нулевые данные в Observable Collection для привязки сетки данных?

Я настроил базу данных на MongoLab, которая запрашивается и анализируется в модели. Коллекция в этой модели, в свою очередь, привязана к сетке данных. Но когда я запрашиваю базу данных, единственными данными, отображаемыми в сетке, является идентификатор объекта для документа.

Чтобы отладить проблему, я инициализировал список постоянными данными для каждого поля, и привязка работает, заполняя каждое поле в сетке.

Что затем заставило меня проверить, как я сопоставляю данные с моделью.

Затем я просмотрел содержимое коллекции Observable, которая возвращается из запроса сервера.

Это показало, что все данные возвращаются, но все поля модели пусты. Вместо этого создается массив клиентов, а поля заполняются в отдельных объектах клиентов.

Кто-нибудь знает, как я могу отладить это дальше?

Сначала я проверил содержимое коллекции, возвращенное из запроса. Который показывает пустые поля модели и массив клиентов:

шаг 1

Затем я проверил содержимое массива customers Customer (которые заполнены):

шаг 2

Документ JSON определяется в MongoLab, а затем сопоставляется с CustomerCollection в приложении CustomerModel:

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 в настоящее время:

Сетка данных заказов


person Brian J    schedule 21.11.2015    source источник


Ответы (1)


Я бы не стал хранить ObservableCollection<T> непосредственно в MongoDB.

Вместо этого я бы сохранил List<T> в MongoDB.

Почему? ObservableCollection<T> — это структура данных, специфичная для WPF, и, вероятно, она не будет работать с MongoDB, если вы не напишете собственный сериализатор. .

Если вы используете MVVM, вам необходимо отделить данные, хранящиеся в MongoDB, от ViewModel. Я бы порекомендовал получить данные из MongoDB, а затем сопоставить их с вашей ViewModel с помощью преобразователя, такого как AutoMapper или ExpressMapper.

См. >другой человек, который столкнулся с той же проблемой.

person Contango    schedule 21.11.2015
comment
Проблема заключалась в том, что я сопоставлял проанализированные данные со списком в модели. Вместо этого я удалил список в модели и вместо этого вернул данные из модели в список в своем классе DataRepo. Ссылка на обе модели: github.com/BrianJVarley/MongoDB_App/ blob/master/MongoDBApp/ Репозиторий: github. com/BrianJVarley/MongoDB_App/blob/master/MongoDBApp/DAL/ - person Brian J; 22.11.2015
comment
Отлично, рад, что вы решили проблему! Может быть хорошей идеей добавить это как Update в конец вашего запроса, чтобы другие пользователи могли видеть, как вы его решили. - person Contango; 23.11.2015