Показать значение из другого объекта в столбце GridView - PullRequest
1 голос
/ 11 июля 2019

У меня есть элемент, связанный с объектом Projects.Объект Project имеет свойство ClientId, которое связано с объектом Client.Объект Client имеет два свойства;свойство Id, которое связано со свойством ClientId и свойством Name.Я легко могу отобразить ClientId из объекта Project, но я хочу отобразить свойство Name из объекта Client.

Я попытался использовать элемент с DataSource, установленным для набора клиентов.Я установил атрибуты Item * со значениями из объекта Clients.Атрибут Value (который требуется и что отображается) не может видеть объект Clients, поэтому я не могу отобразить значение в свойстве Name в объекте Client.

из 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>

Что мне нужно сделать, чтобы отобразить значение имени из объекта Client в этом GridView?

Ответы [ 2 ]

0 голосов
/ 16 июля 2019

В целом, лучший подход - это подготовить объекты для 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 имеет свойство Name, AutoMapper автоматически определит сопоставление, поэтому вам даже не нужно настраивать правило для свойства ClientName.

При таком подходе это может выглядеть таксоздано много ненужных классов.Но в случае более крупных приложений я вижу это как преимущество, потому что часто вам нужно добавить столбец на одном экране и иметь отдельный класс для этого, что означает, что вы не влияете на другие экраны в приложении.

0 голосов
/ 15 июля 2019

Я закончил, используя словарь с (длинным) Id в ключе и отображаемым значением строки в значении.

<bp:GridViewTextColumn HeaderText="Client"
                                   Value="{value: _root.ClientNames[ClientId]}"
                                   AllowSorting="True" />
...