【问题标题】:Binding an ObservableCollection of two related entities to one DataGrid将两个相关实体的 ObservableCollection 绑定到一个 DataGrid
【发布时间】:2013-02-11 01:57:42
【问题描述】:
我的模型文件中有两个相关实体。
它们看起来像:
MasterPartNumber (parent, one) --> MasterPartsList (children, many)
(PK) partNum (PK) listID
partNumDesc (FK) partNum
parentAssyPartNum
如果我只能将我的 DataGrid 的 ItemsSource 绑定到一个ObservableCollection,
如何在我的 DataGrid 中包含来自这两个相关实体的所有信息?
注意:我没有绑定到collectionViews,只依赖PropertyChanged 通知并将“SelectedItem”设置为我的视图模型上的属性。我意识到我很可能需要将其中一种实体类型转换为另一种,以便将它们组合到一个集合中。
提前致谢!
【问题讨论】:
标签:
c#
linq
entity-framework
datagrid
observablecollection
【解决方案1】:
发布此消息几分钟后,我意识到一切都已正确设置,我只是在包含(/相关)表属性的 xaml 绑定上有错字:
我的viewmodel相关代码如下:
public ObservableCollection<MasterPartNumber> AssyPns
{
get
{
var enumerable = this._context.MasterPartNumbers.Include("MasterPartsLists").Where(t => t.MasterPartsLists.Any(x => x.isAssy == true));
return this._assyPns = new ObservableCollection<MasterPartNumber>(enumerable);
}
set
{
this._assyPns = value;
RaisePropertyChanged("AssyPns");
}
}
public MasterPartNumber SelectedTopLevelAssyPN //<-- this is the selected Parent item i am getting my DataGrid's ObservableCollection from
{
get { return this._selectedTopLevelAssyPN; }
set
{
this._selectedTopLevelAssyPN = value;
RaisePropertyChanged("SelectedTopLevelAssyPN");
RaisePropertyChanged("SelectedAssyBOMLineItems");
}
}
public ObservableCollection<MasterPartsList> SelectedAssyBOMLineItems //<-- this is my itemsSource
{
get
{
if (this._selectedTopLevelAssyPN != null)
{
var children = _context.MasterPartsLists.Where(lineItem => lineItem.parentAssyPN != null)
.Where(lineItem => lineItem.parentAssyPN == this._selectedTopLevelAssyPN.pn);
return this._selectedAssyBOMLineItems = new ObservableCollection<MasterPartsList>(children);
}
return this._selectedAssyBOMLineItems;
}
set
{
this._selectedAssyBOMLineItems = value;
RaisePropertyChanged("SelectedAssyBOMLineItems");
}
}
我将 dataGrid TextColumn 绑定到的路径只是
{Binding MasterPartNumber.pnDesc}
感谢两位如此及时的回复。
【解决方案2】:
如果您将DataContext 的DataGrid 绑定到您的父母列表,然后在每个子项的数据模板中将DataContext 绑定到子项,这可能会更容易。
然后,您可以在任何需要的地方获取信息。
【解决方案3】:
您可以创建MasterPartsList 实体的部分类并访问您的子实体详细信息。
public partial class MasterPartsList
{
public string PartDescription
{
get { return this.MasterPartNumber.partNumDesc; }
}
}