在GridView列中显示来自其他对象的值

时间:2019-07-11 15:35:00

标签: gridview dotvvm

我有一个绑定到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值?

2 个答案:

答案 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属性配置规则。

使用此方法可能会创建许多不必要的类。但是对于大型应用程序,我认为这是一个优势,因为通常您需要在一个屏幕上添加一列,并为此设置一个单独的类,这意味着您不会影响应用程序中的其他屏幕。