我试图让 DataGrid 显示 object[][]
的内容.这将是只读的,所以我不关心通知更改或类似的事情。设置ItemSource
到 object[][]
只显示 Array
的属性在网格中,并使用 List<List<object>>
而是做同样的事情,这绝对是无益的。
每个一维数组的列数可以是任意的;我只想为每行中的每个数组元素创建一个未命名的列。我怎样才能做到这一点?
最佳答案
在 this question 中查看我的答案.这也将启用值的编辑。由于您只是对显示它们感兴趣,因此如果不需要使用 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); } }
}
和一个帮助类从二维数组中获取动态列
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");
}
关于.net - 在 DataGrid 中显示二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4460946/