Как привязать 2D массив bool[][] к WPF DataGrid (односторонний)?
У меня есть матрица типа datagrid, как это.
Эта сетка полностью разработана в XAML
Теперь как вставить значения в эти datagridcell с 2-мерным массивом ?
значения, которые необходимо вставить, должны иметь тип данных bool
(либо TRUE, либо FALSE).
Есть идеи ?
1 ответ:
Вот мой подход для сценария MVVM, используя конвертер, который создает DataView, который может быть привязан к сеткам
ItemsSource
. Это для специального матричного типа данных, который содержит двойники, но вы сможете изменить его самостоятельно для ваших требований:public class MatrixToDataViewConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var array = value as Matrix; if (array == null) return null; //var array = ILMath.rand(3, 5); var rows = array.Dimensions[0]; var columns = array.Dimensions[1]; var t = new DataTable(); for (var c = 0; c < columns; c++) { t.Columns.Add(new DataColumn(c.ToString())); } for (var r = 0; r < rows; r++) { var newRow = t.NewRow(); for (var c = 0; c < columns; c++) { var v = array[r, c]; // Round if parameter is set if (parameter != null) { int digits; if (int.TryParse(parameter.ToString(), out digits)) v = Math.Round(v, digits); } newRow[c] = v; } t.Rows.Add(newRow); } return t.DefaultView; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
Определите ресурс для преобразователя:
<converter:MatrixToDataViewConverter x:Key="MatrixToDataViewConverter" />
И использовать его так:
Однако он не допускает двусторонней привязки...<DataGrid ItemsSource="{Binding Matrix, Converter={StaticResource MatrixToDataViewConverter}, ConverterParameter=1}"/>
EDIT
Вот версия для массива бул [] []:
public class BoolArrayToDataViewConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { var array = value as bool[,]; if (array == null) return null; var rows = array.GetLength(0); if (rows == 0) return null; var columns = array.GetLength(1); if (columns == 0) return null; var t = new DataTable(); // Add columns with name "0", "1", "2", ... for (var c = 0; c < columns; c++) { t.Columns.Add(new DataColumn(c.ToString())); } // Add data to DataTable for (var r = 0; r < rows; r++) { var newRow = t.NewRow(); for (var c = 0; c < columns; c++) { newRow[c] = array[r, c]; } t.Rows.Add(newRow); } return t.DefaultView; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); } }
И использование:
<DataGrid ItemsSource="{Binding Matrix, Converter={StaticResource BoolArrayToDataViewConverter}}"/>
И вот как это выглядит в очень сырой версии. Затем вы можете стилизовать DataGrid и отредактировать его шаблоны, но это уже другой вопрос...