2016-12-04 7 views
2

Я застрял на этом уже несколько дней и просто не могу найти решение самостоятельно. Я пытаюсь заполнить DataGrid List<Plants> как ItemsSource. Проблема заключается в том, тип Plant имеет элемент типа ICollection<PlantType>, для которого мне нужно отобразить в соответствующем столбце DataGrid в виде строки, где каждый элемент в ICollection на новой линии, как это:C# DataGrid, заполненный списками с несколькими слоями

"Type1, \n Type2, \n ..." 

Здесь я покажу упрощенный код (копирование всего кода немного переусердствует).

public partial class Plants 
{ 
    public Plants() 
    { 
     PlantType = new HashSet<PlantType>(); 
    } 

    public int ID { get; set; } 
    public string Name { get; set; } 
    public int Page { get; set; } 

    public virtual ICollection<PlantType> PlantType { get; set; } 
} 

Обратите внимание, что PlantType имеет Type колонку (не Plant). Теперь я хочу, чтобы заполнить DataGrid с этой информацией, чтобы в идеале это будет выглядеть следующим образом:

----------------------------------------- 
| Name | Page |  Type  | 
|---------------------------------------| 
| plant1 | 3  | supporting  | 
|---------------------------------------| 
| pla2 | 13  | not-supporting | 
|---------------------------------------| 
|   |   | test   | 
|---------------------------------------| 
|   |   | also this type | 
|---------------------------------------| 
|   |   | type   | 
|---------------------------------------| 
| plantZ | 40  | test   | 
----------------------------------------- 

Проблема на данный момент, он заполняет только во имя и страницы (так как те не HashSets и поэтому ясно,). Это как мой код для заполнения DataGrid выглядит:

private void BuildDataGridContent(List<Plants> lList) 
{ 
    dataGrid.IsReadOnly = true; 
    dataGrid.AutoGenerateColumns = false; 
    dataGrid.ItemsSource = lList; 

    DataGridTextColumn textColumn1 = new DataGridTextColumn(); 
    DataGridTextColumn textColumn2 = new DataGridTextColumn(); 
    DataGridTextColumn textColumn3 = new DataGridTextColumn(); 

    textColumn1.Header = "Name"; 
    textColumn1.Binding = new Binding("Name"); 
    textColumn2.Header = "Page"; 
    textColumn2.Binding = new Binding("Page"); 
    textColumn3.Header = "Type"; 
    textColumn3.Binding = new Binding("Type"); // <-- the problem is here. It can't directly access lList.PlantType.Type (PlantType = Table name; Type = column name in the SQL DB) 

    dataGrid.Columns.Add(textColumn1); 
    dataGrid.Columns.Add(textColumn2); 
    dataGrid.Columns.Add(textColumn3); 
} 

Я попытался вещи, но закончились идеи и термины поиска Google. Может ли кто-нибудь сказать мне, как я правильно привязываю Type к колонке таким образом?

+0

Ваш пример желаемого вида немного неясен. Вы говорите, что для каждого экземпляра «Plant» должна быть строка, за которой следует строка для каждого экземпляра «PlantType» в соответствующем «ICollection »? – blins

+0

Да, это немного непонятно, извините. Я имею в виду, что типы должны быть перечислены в той же строке, что и исходная установка, но разделены запятой и разрывом строки. В примере «test» «также этот тип» и «тип» будут в той же строке, что и «не поддерживаются» (все они являются частью имени: pla2), но в указанной форме. Чтобы сделать это более понятным: Plantname | страница | planttype (указан, так как может быть более одного за раз) – Vitriol

+0

Я бы создал класс «PlantViewModel», который имеет свойство типа «Тип» строки типа с теми же свойствами «Имя» и «Страница». Тогда я бы просто сопоставил «Plant» с «PlantViewModel» и, наконец, привязал к PlantViewModels. – blins

ответ

0

Простым решением может быть просто ввести тип PlantViewModel для привязки к каждой строке DataGrid вместо привязки непосредственно к типу вашей модели данных (Plant). Это, конечно, требует переопределения некоторых свойств модели представления, которые также находятся в модели данных, плюс введение логики отображения от Plant до PlantViewModel и, возможно, наоборот (если ваш просмотр доступен для редактирования), но это способствует ослаблению связи между моделью данных и представлением.

Смежные вопросы