我有一个绑定到Projects对象的元素。 Project对象具有链接到Client对象的ClientId属性。 Client对象具有两个属性;链接到ClientId属性和Name属性的Id属性。我可以轻松显示Project对象中的ClientId,但是我想显示Client对象中的Name属性。
我尝试使用一个DataSource设置为Clients集合的元素。我已经使用来自Clients对象的值设置了Item *属性。 “值”属性(必填和显示的内容)无法看到“客户端”对象,因此无法在“客户端”对象的“名称”属性中显示该值。
从ViewModel正确初始化和填充两个属性
public BusinessPackDataSet<MasonAndHangerWebApi.Models.BimCimData.Project> Projects { get; set; }
public IList<MasonAndHangerWebApi.Models.BimCimData.Client> Clients { get; set; }
从视图
<bp:GridView DataSource="{value: Projects}" ...>
...
<bp:GridViewComboBoxColumn DataSource="{value: Clients}"
HeaderText="Client"
ItemKeyBinding="{value: _parent.ClientId}"
ItemTextBinding="{value: Name}"
ItemValueBinding="{value: Name}"
Value="{value: Cannot see values from the Clients datasource }" />
...
</bp:GridView>
我需要怎么做才能在此GridView中显示Client对象的Name值?
答案 0 :(得分:0)
我使用了一个字典作为结尾,该字典的Key是(long)Id,Value是字符串显示值。
<bp:GridViewTextColumn HeaderText="Client"
Value="{value: _root.ClientNames[ClientId]}"
AllowSorting="True" />
答案 1 :(得分:0)
通常,更好的方法是以所需的确切格式为GridView准备对象。
创建一个新类,其中包含GridView所需的所有属性,并且要避免使用大量将转换数据的代码,可以使用AutoMapper或类似的库。
public class ProjectDisplayDto
{
// all properties from the Project class
public string ClientName { get; set; }
}
在AutoMapper配置中,您只需要创建一个映射。具有相同名称和类型的属性将自动映射。您只需要定义规则即可映射其他规则。
mapper.CreateMap<Project, ProjectDisplayDto>()
.ForMember(p => ClientName, m => m.MapFrom(p => ...)); // tell AutoMapper how to get the client name
如果您使用的是Entity Framework,并且Project
类是一个实体,则该类中可能包含Client导航属性。如果Client
具有Name属性,则AutoMapper将自动找出映射,因此您甚至不需要为ClientName
属性配置规则。
使用此方法可能会创建许多不必要的类。但是对于大型应用程序,我认为这是一个优势,因为通常您需要在一个屏幕上添加一列,并为此设置一个单独的类,这意味着您不会影响应用程序中的其他屏幕。