Я динамически генерирую DataGrid
и добавляю его к StackPanel
в своем приложении WPF.
Так как объект генерируется динамически, на стороне XAML для него нет разметки, и мне нужно управлять привязкой и всеми свойствами программно.
Я хочу, чтобы у моего DataGrid
былазначения в ячейке переносятся на следующую строку, если текст длинный.Я понимаю, что мне нужно заменить DataGridCell
на TextBlock
и установить для него свойство TextWrap
.Все примеры, которые я нашел, наводят на мысль о самих этих строках.Однако я не смог найти способ сделать это полностью из кода без XAML.
До сих пор я пытался использовать следующий код, но он не работает.
DataGrid dg = new DataGrid();
dg.ItemsSource = ((DataSet)data).Tables[0].DefaultView;
dg.DataContext = ((DataSet)data).Tables[0].DefaultView;
DataTemplate ct = new DataTemplate(typeof(DataGridCell));
FrameworkElementFactory tb = new FrameworkElementFactory(typeof(TextBlock));
tb.SetValue(TextBlock.TextWrappingProperty, TextWrapping.Wrap);
ct.VisualTree = tb;
dg.ItemTemplate = ct;
dg.ColumnWidth = 300;
Не могли бы вы указать мне правильное направление здесь?
[Обновление]: Решение
При дальнейших исследованиях мне удалось найти решение моей проблемы.Для автоматически сгенерированных столбцов нам нужно захватить событие AutoGeneratingColumn
и заменить значение по умолчанию DataGridTextColumn
на DataGridTemplateColumn
, в котором будет TextBlock
.И затем мы можем установить TextWrappingProperty для переноса текста.
Ниже приведен обновленный код:
DataGrid dg = new DataGrid();
dg.ItemsSource = ((DataSet)data).Tables[0].DefaultView;
dg.DataContext = ((DataSet)data).Tables[0].DefaultView;
DataTemplate ct = new DataTemplate(typeof(DataGridCell));
FrameworkElementFactory tb = new FrameworkElementFactory(typeof(TextBlock));
tb.SetValue(TextBlock.TextWrappingProperty, TextWrapping.Wrap);
ct.VisualTree = tb;
dg.AutoGeneratingColumn += new EventHandler<DataGridAutoGeneratingColumnEventArgs>(dg_AutoGeneratingColumn);
dg.MaxColumnWidth = 300;
, а затем код в обработчике событий:
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
//cancel the auto generated column
e.Cancel = true;
//Get the existing column
DataGridTextColumn dgTextC = (DataGridTextColumn)e.Column;
//Create a new template column
DataGridTemplateColumn dgtc = new DataGridTemplateColumn();
DataTemplate dataTemplate = new DataTemplate(typeof(DataGridCell));
FrameworkElementFactory tb = new FrameworkElementFactory(typeof(TextBlock));
tb.SetValue(TextBlock.TextWrappingProperty, TextWrapping.Wrap);
dataTemplate.VisualTree = tb;
dgtc.Header = dgTextC.Header;
dgtc.CellTemplate = dataTemplate;
tb.SetBinding(TextBlock.TextProperty, dgTextC.Binding);
//add column back to data grid
DataGrid dg = sender as DataGrid;
dg.Columns.Add(dgtc);
}