我有一个带有autogenerate列的DataGrid是真的,因为它的列是从视图模型动态添加的。我仍然希望启用文本换行,因为在调整列的大小时,文本会被隐藏。
XAML代码:
<DataGrid x:Name="individualGrid" Margin="0,2,0,0" Visibility="{Binding ElementName=individualFilter, Path=IsChecked, Converter={StaticResource BoolToVisibility}}"
Grid.Row="4" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" AutoGenerateColumns="True" VerticalScrollBarVisibility="Auto" Height="500"
ItemsSource="{Binding ElementName=deptFilter, Path=SelectedItem.Individuals.View}" AutomationProperties.AutomationId="AID_UH_individualGrid" ColumnWidth="*" MinColumnWidth="140" />
请帮忙。
更新1
我通过处理自动生成事件尝试了代码隐藏方法。它工作但是添加了多个相同类型的列。
private void IndividualGrid_OnAutoGeneratingColumn(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;
if (dg != null) dg.Columns.Add(dgtc);
}
有人可以建议为什么添加多列,而它应该只有两列。
更新2
我终于通过处理自动生成找到了解决方案。 这是解决方案:
private void IndividualGrid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
//Get the existing column
DataGridTextColumn dgTextC = (DataGridTextColumn)e.Column;
if (dgTextC != null)
dgTextC.ElementStyle = individualGrid.Resources["wordWrapStyle"] as Style;
}
但现在还有一个问题。开头有一个额外的列看起来像一个索引列。有什么建议吗?
答案 0 :(得分:2)
实现目标的唯一方法是处理AutoGeneratingColumn
event。来自MSDN上的DataGrid.AutoGenerateColumns
Property页:
当AutoGenerateColumns属性设置为true时,将为每个创建的列引发AutoGeneratingColumn事件。您可以更改或取消在AutoGeneratingColumn事件处理程序中创建的列。
<DataGrid Name="DG1" ItemsSource="{Binding}" AutoGenerateColumns="True"
AutoGeneratingColumn="DG1_AutoGeneratingColumn" />
...
//Access and update columns during autogeneration
private void DG1_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
string headername = e.Column.Header.ToString();
//Cancel the column you don't want to generate
if (headername == "MiddleName")
{
e.Cancel = true;
}
//update column details when generating
if (headername == "FirstName")
{
e.Column.Header = "First Name";
}
else if (headername == "LastName")
{
e.Column.Header = "Last Name";
}
else if (headername == "EmailAddress")
{
e.Column.Header = "Email";
}
}
但是,您基本上需要为列提供新的ItemTemplate
以实现文本换行,并且您无法使用此方法执行此操作。
但是,还有另一种方法可以实现此目的,您可以覆盖Style
的默认DataGridCell
并添加TextBlock
TextWrapping="Wrap"
设置它。请查看WPF DataGrid: How do I set columns to TextWrap?问题的答案,了解如何执行此操作。