List <List <String >> для таблицы данных wpf

1

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

  1. Тест, тест, тест
  2. Тест, тест,
  3. Тест, Тест, Тест, Тест

Я хотел бы сделать так, чтобы это создавало 4 столбца, где две более короткие строки оставляют последние столбцы пустыми. Я попытался установить DataContext в список objet, но это не похоже на путь...

Кто-нибудь знает, как это можно сделать?

  • 0
    Вложенные ItemControls из @il_agent выглядят хорошо. Для реального решения DataGrid см. Codeproject.com/Tips/676530 . Намного больше работы.
Теги:
wpf
datagrid

2 ответа

1
Лучший ответ

Я бы предложил вам создать класс с 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;
        }
  • 0
    Это будет работать только для 4 полей, проблема здесь в том, что это может быть 4 поля или 22 поля, я не знаю этого с самого начала ...
  • 0
    Редактирование было действительно полезным! Спасибо!
1

Я думаю, что с 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>

Надеюсь, это поможет вам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню