Siehe meine Antwort in diese Frage . Dies ermöglicht auch die Bearbeitung der Werte. Da Sie nur an der Anzeige der Werte interessiert sind, ist es vielleicht einfacher, die Antwort von Jobi Freude wenn die Verwendung des DataGrid nicht erforderlich ist.
Um eine Kurzfassung der Antwort auf diese Frage zu geben. Sie benötigen eine Ref-Klasse
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); } }
}
Und eine Hilfsklasse, um dynamische Spalten aus dem 2d-Array zu erhalten
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;
}
}
Danach können Sie ItemsSource wie folgt verwenden
<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");
}