如何将 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 检索数据,然后使用 AutoMapper
或 ExpressMapper
.
等映射器将其映射到您的 ViewModel
参见another person who ran into the same problem。
我在 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.
如果您使用的是 MVVM,则需要将存储在 MongoDB 中的数据与 ViewModel 分开。我建议从 MongoDB 检索数据,然后使用 AutoMapper
或 ExpressMapper
.
参见another person who ran into the same problem。