Я хотел бы отобразить таблицу строк в C # с использованием DataGrid.Имена столбцов генерируются динамически (т.е. не известны во время компиляции).
Вот пример:
Здесь числа были преобразованы в строки,
Я использую DataTable в качестве источника для DataGrid, который содержит всю таблицу (строки и заголовки столбцов).Однако у меня проблема в том, что значения в столбце «изменение климата» не отображаются в DataGrid.Вместо этого я получаю следующее сообщение об ошибке на консоли
"BindingExpression path error: 'climate w' property not found on 'object'
''DataRowView' (HashCode=22429696)'. BindingExpression:Path=climate
w/change; DataItem='DataRowView' (HashCode=22429696); target element is
'TextBlock' (Name=''); target property is 'Text' (type 'String')"
Я понимаю, что это происходит из-за косой черты ("/") в имени столбца, которое интерпретируется как выражение привязки.
Мои вопросы
- Есть ли способ отключить это поведение, то есть, чтобы имена столбцов интерпретировались как выражения привязки?Поскольку я предоставляю DataTable со всеми значениями и заголовками для строк и столбцов, ни одно из значений данных не должно вычисляться на основе имени столбца.Также у столбца «токсичность для человека» нет проблем, хотя не существует свойства HumanToxicity.
- Если я не могу использовать DataTable в качестве источника для DataGrid для достижения вышеизложенного, то есть правильной структуры данных, которая должна бытьused?
Вот код для создания DataTable.
public DataTable PaValues { get; set; }
private void CreateDataSet()
{
var dt = new DataTable("Perturbation Analysis");
List<String> ics = _perturbationAnalysis.ImpactCatagories();
dt.Columns.Add("Parameters");
foreach (var ic in ics)
{
dt.Columns.Add(Sanatize(ic));
}
foreach (var parameter in _perturbationAnalysis.ParameterNames())
{
var dr = dt.NewRow();
dr[0] = parameter;
for (int i = 0; i < ics.Count; i++)
{
dr[i+1] = _perturbationAnalysis[parameter, ics[i]].ToString();
}
dt.Rows.Add(dr);
}
PaValues = dt;
}
private string Sanatize(string ic)
{
//return ic.Replace("/", "[/]").Replace("[", "").Replace("]", "").Replace(".", " ");
//return "[" + ic + "]";
return ic;
}
Вот выдержка из файла XAML
<DataGrid
x:Name="PAGrid"
CanUserAddRows="False"
CanUserDeleteRows="False"
ClipboardCopyMode="IncludeHeader"
FrozenColumnCount="1"
ItemsSource="{Binding Path=PaValues,UpdateSourceTrigger=PropertyChanged}"
Style="{StaticResource DataGridStyle}"
IsReadOnly="True">
</DataGrid>
Как предлагается вкомментарии, я добавил обработчик AutoGeneratingColumn, который изменяет привязку для использования квадратных скобок:
private void PaViewAutoGeneratingColumnHandler(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
e.Column = new DataGridTextColumn
{
Binding = new Binding("[" + e.Column.Header + "]"), Header=e.Column.Header
};
}
Теперь он отлично работает для "климата с изменением", но не работает для столбца с именем "EDIP2003без LT, подкисление без LT, подкисление без LT ", что является реальным примером, используемым клиентом.Сообщение об ошибке такое же, как и раньше
BindingExpression path error: '[]' property not found on 'object' ''DataRowView' (HashCode=56876317)'.
BindingExpression:Path=[EDIP2003 w/o LT, acidification w/o LT, acidification w/o LT]