1

我有一个绑定到 Projects 对象的元素。Project 对象具有链接到 Client 对象的 ClientId 属性。Client 对象有两个属性;链接到 ClientId 属性和 Name 属性的 Id 属性。我可以轻松地显示来自 Project 对象的 ClientId,但我想显示来自 Client 对象的 Name 属性。

我尝试使用将 DataSource 设置为客户端集合的元素。我已经使用来自 Clients 对象的值设置了 Item* 属性。Value 属性(这是必需的和显示的)看不到 Clients 对象,因此我无法在 Client 对象的 Name 属性中显示值。

从 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 值?

4

2 回答 2

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

如果您使用的是实体框架并且Project类是一个实体,那么您可能会在此类中拥有客户端导航属性。如果Client有 Name 属性,AutoMapper 会自动计算映射,所以你甚至不需要为ClientName属性配置规则。

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

于 2019-07-16T07:50:59.810 回答
0

我最终使用了一个字典,键中的 (long)Id 和值中的字符串显示值。

<bp:GridViewTextColumn HeaderText="Client"
                                   Value="{value: _root.ClientNames[ClientId]}"
                                   AllowSorting="True" />
于 2019-07-15T08:44:45.200 回答