У меня есть список со списками строк, представляющих строки и столбцы, которые мне нравится показывать в моем datagrid. Количество строк в каждой строке не обязательно должно быть постоянным, поэтому скажите, что список может выглядеть примерно так:
Я хотел бы сделать так, чтобы это создавало 4 столбца, где две более короткие строки оставляют последние столбцы пустыми. Я попытался установить DataContext в список objet, но это не похоже на путь...
Кто-нибудь знает, как это можно сделать?
Я бы предложил вам создать класс с 4 полями, например
public class Data{
public string Field1{get;set;}
public string Field2{get;set;}
public string Field3{get;set;}
public string Field4{get;set;}
}
Пример будет таким
var ls = new List<Data>();
// Fill your data in 'List<List<string>>' to ls
dataGrid.AutoGenerateColumns = false;
dataGrid.ItemSource = ls;
РЕДАКТИРОВАТЬ
У меня был вид DataGrid, кажется, что поддержки такого типа привязки нет.
Я придумал другое решение с помощью Dynamically Add С# Properties в Runtime
Я хотел бы посмотреть, есть ли другой лучший способ.
var list = new List<List<string>>
{
new List<string> {"Test", "Test", "Test"},
new List<string> {"Test", "Test", ""},
new List<string> {"Test", "Test", "Test", "Test"}
};
var maxLength = list.Max(c => c.Max(r => r.Length));
for (int i = 0; i < maxLength; i++)
{
ResulDataGrid.Columns.Add(new DataGridTextColumn() { Header = "Field" + i, Binding = new Binding("Row" + i) });
}
foreach (var listItem in list)
{
var properties = new Dictionary<string, object>();
for (int i = 0; i < listItem.Count; i++)
{
properties.Add("Row" + i, listItem[i]);
}
var myObject = GetDynamicObject(properties);
ResulDataGrid.Items.Add(myObject);
}
public static dynamic GetDynamicObject(Dictionary<string, object> properties)
{
var dynamicObject = new ExpandoObject() as IDictionary<string, Object>;
foreach (var property in properties)
{
dynamicObject.Add(property.Key, property.Value);
}
return dynamicObject;
}
Я думаю, что с DataGrid вы не сможете этого сделать. Или это будет очень сложно, а не тривиально. Вместо DataGrid вы можете использовать вложенные элементы ItemsControls. Что-то вроде того:
<ItemsControl ItemsSource = {Binding MyList}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource = {Binding}>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text = {Binding}/>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Надеюсь, это поможет вам.