Я застрял на этом уже несколько дней и просто не могу найти решение самостоятельно. Я пытаюсь заполнить 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
к колонке таким образом?
Ваш пример желаемого вида немного неясен. Вы говорите, что для каждого экземпляра «Plant» должна быть строка, за которой следует строка для каждого экземпляра «PlantType» в соответствующем «ICollection»? –
blins
Да, это немного непонятно, извините. Я имею в виду, что типы должны быть перечислены в той же строке, что и исходная установка, но разделены запятой и разрывом строки. В примере «test» «также этот тип» и «тип» будут в той же строке, что и «не поддерживаются» (все они являются частью имени: pla2), но в указанной форме. Чтобы сделать это более понятным: Plantname | страница | planttype (указан, так как может быть более одного за раз) – Vitriol
Я бы создал класс «PlantViewModel», который имеет свойство типа «Тип» строки типа с теми же свойствами «Имя» и «Страница». Тогда я бы просто сопоставил «Plant» с «PlantViewModel» и, наконец, привязал к PlantViewModels. – blins