Показать 2d массив в DataGrid - PullRequest
       0

Показать 2d массив в DataGrid

3 голосов
/ 16 декабря 2010

Я пытаюсь получить DataGrid для отображения содержимого object[][].Это будет только для чтения, поэтому меня не волнуют изменения уведомлений или что-то в этом роде.Установка ItemSource в object[][] просто отображает свойства Array в сетке, а использование List<List<object>> делает то же самое, что явно бесполезно.

Количество столбцов в каждом 1d массивеможет быть произвольным;Я просто хочу, чтобы безымянный столбец создавался для каждого элемента массива в каждой строке.Как я могу это сделать?

1 Ответ

1 голос
/ 16 декабря 2010

Смотрите мой ответ в этот вопрос .Это также позволит редактировать значения.Так как вы просто заинтересованы в их отображении, может быть проще использовать ответ из Jobi Joy , если использование DataGrid не является обязательным.

Чтобы сделать краткую версию ответаиз этого вопроса.Вам понадобится класс Ref

public class Ref<T>
{  
    private readonly Func<T> getter;   
    private readonly Action<T> setter;  
    public Ref(Func<T> getter, Action<T> setter)   
    {   
        this.getter = getter;   
        this.setter = setter;   
    }  
    public T Value { get { return getter(); } set { setter(value); } }   
}  

и вспомогательный класс для получения динамических столбцов из массива 2d

public class BindingHelper
{
    public DataView GetBindable2DViewFromIList<T>(IList list2d)
    {
        DataTable dataTable = new DataTable();
        for (int i = 0; i < ((IList)list2d[0]).Count; i++)
        {
            dataTable.Columns.Add(i.ToString(), typeof(Ref<T>));
        }
        for (int i = 0; i < list2d.Count; i++)
        {
            DataRow dataRow = dataTable.NewRow();
            dataTable.Rows.Add(dataRow);
        }
        DataView dataView = new DataView(dataTable);
        for (int i = 0; i < list2d.Count; i++)
        {
            for (int j = 0; j < ((IList)list2d[i]).Count; j++)
            {
                int a = i;
                int b = j;
                Ref<T> refT = new Ref<T>(() => (list2d[a] as IList<T>)[b], z => { (list2d[a] as IList<T>)[b] = z; });                    
                dataView[i][j] = refT;
            }
        }
        return dataView;
    }
}

После этого вы можете использовать ItemsSource, например,

<DataGrid Name="dataGrid" 
          RowHeaderWidth="0" 
          ColumnHeaderHeight="0" 
          AutoGenerateColumns="True" 
          AutoGeneratingColumn="dataGrid_AutoGeneratingColumn"/> 

dataGrid.ItemsSource = BindingHelper.GetBindable2DViewFromIList<object>(m_2DArray);

private void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    DataGridTextColumn column = e.Column as DataGridTextColumn; 
    Binding binding = column.Binding as Binding; 
    binding.Path = new PropertyPath(binding.Path.Path + ".Value");
}
...