如何在DataGrid中将autogeneratecolumns设置为true时进行文本换行

时间:2014-07-07 12:43:50

标签: c# wpf datagrid

我有一个带有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;
}

但现在还有一个问题。开头有一个额外的列看起来像一个索引列。有什么建议吗?

1 个答案:

答案 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?问题的答案,了解如何执行此操作。