.net 在DataGrid中显示二维数组

.net 在DataGrid中显示二维数组,.net,wpf,data-binding,wpfdatagrid,.net,Wpf,Data Binding,Wpfdatagrid,我正试图让DataGrid显示对象[]【】的内容。这将是只读的,所以我不关心通知更改或诸如此类的事情。将ItemSource设置为object[][]只会在网格中显示Array的属性,而使用List则会执行相同的操作,这显然没有什么帮助 每个1d数组中的列数可以是任意的;我只是希望为每行中的每个数组元素创建一个未命名的列。我如何才能做到这一点?请参阅中的我的答案。这也将允许编辑值。由于您只是对显示它们感兴趣,如果不需要使用DataGrid,那么使用Jobi Joy的答案可能会更容易 对这个问题的

我正试图让DataGrid显示
对象[]【】
的内容。这将是只读的,所以我不关心通知更改或诸如此类的事情。将
ItemSource
设置为
object[][]
只会在网格中显示
Array
的属性,而使用
List
则会执行相同的操作,这显然没有什么帮助

每个1d数组中的列数可以是任意的;我只是希望为每行中的每个数组元素创建一个未命名的列。我如何才能做到这一点?

请参阅中的我的答案。这也将允许编辑值。由于您只是对显示它们感兴趣,如果不需要使用DataGrid,那么使用Jobi Joy的答案可能会更容易

对这个问题的答案做一个简短的版本。你需要一个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); } }   
}  
公共类参考
{  
私有只读函数getter;
私有只读操作设置器;
公共引用(Func getter、Action setter)
{   
this.getter=getter;
this.setter=setter;
}  
公共T值{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;
    }
}
公共类BindingHelper
{
公共数据视图GetBindable2ViewfromIList(IListList2D)
{
DataTable=新的DataTable();
对于(int i=0;i<((IList)list2d[0])。计数;i++)
{
Add(i.ToString(),typeof(Ref));
}
for(int i=0;i(list2d[a]作为IList)[b],z=>{(list2d[a]作为IList)[b]=z;});
数据视图[i][j]=refT;
}
}
返回数据视图;
}
}
之后,您可以像这样使用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");
}

dataGrid.ItemsSource=BindingHelper.GetBindable2DViewFromIList(m_2DArray);
私有void dataGrid_AutoGeneratingColumn(对象发送方,DataGridAutoGeneratingColumnEventArgs e)
{ 
DataGridTextColumn=e.列作为DataGridTextColumn;
绑定=列。绑定为绑定;
binding.Path=新属性路径(binding.Path.Path+“.Value”);
}

10K中的5分,恭喜:)我最终只是使用
rows.Add(rowArray)
在数据表中创建了行,并使用
AsDataView
扩展方法获得了一个数据视图。