Двусторонняя привязка между DataGrid и массивом

У меня есть массив называется:

string[,] TableData;

можно ли связать его содержимое с элементом управления DataGrid с помощью привязки?

Если возможно, я хотел бы, чтобы пользователь мог редактировать сетку и отражать изменения в массиве.

3 ответов


см. Этот вопрос: как заполнить сетку WPF на основе двумерного массива

можно использовать этот элемент управления под названием DataGrid2D (здесь исходный код). Чтобы использовать его, просто добавьте ссылку на DataGrid2DLibrary.dll, добавьте это пространство имен

xmlns:dg2d="clr-namespace:DataGrid2DLibrary;assembly=DataGrid2DLibrary"

а затем создайте DataGrid2D и свяжите его с вашим IList, 2D-массивом или массивом 1D, как это

<dg2d:DataGrid2D Name="dataGrid2D"
                 ItemsSource2D="{Binding Int2DList}"/>

пользователи смогут редактировать данные и изменения, внесенные в DataGrid будет отражено в 2D массиве


вы не можете привязать матрицу к DataGrid. Однако в зависимости от того, чего вы пытаетесь достичь, вы можете преобразовать его в массив class.

каково содержание вашей матрицы? Почему бы тебе не попробовать нечто подобное?

public class MyClass
{
    public string A { get; set; }
    public string B { get; set; }

    public MyClass(string a, string b)
    {
        Debug.Assert(a != null);
        Debug.Assert(b != null);

        this.A = a;
        this.B = b;
    }
}

затем создайте экземпляр следующего содержания:

MyClass[] source = { new MyClass("A", "B"), new MyClass("C", "D") };
this.dataGrid.ItemsSource = source;

кроме того, если вы не можете изменить тип источника, попробуйте использовать LINQ для его проецирования:

var source = (from i in Enumerable.Range(0, matrix.GetLength(0))
              select new MyClass(matrix[i, 0], matrix[i, 1])).ToList();
this.dataGrid1.ItemsSource = source;

самый простой способ-использовать сборку в WPF Datagrid и спроецировать массив на класс представления, который будет привязан.

вы хотите, чтобы ваши пользователи могли добавлять строки? Если да, привязка к массиву невозможна, потому что вы не можете добавлять строки.

Если у вас есть какое-либо количество столбцов, вы должны иметь возможность проецировать свой массив на динамический объект и установить свойство AutoGenerateColumns datagrid в true. У ваших колонок есть имена?