WPF DataGrid列TextWrapping以编程方式

时间:2016-02-21 22:39:04

标签: c# wpf windows datagrid

基本上我想要实现的是只有我的DataGrid的第二列才能启用文本换行,而不是在没有空间的情况下剪切它。

我的问题是xaml代码中的DataGrid是空的,我是通过编程方式从类生成的。

DataGrid的Xaml是这样的:

<DockPanel Grid.Row="1">
    <DataGrid Name="dg_Misc" Margin="2" Background="#FF212121" SelectionUnit="Cell" VerticalGridLinesBrush="Black" GridLinesVisibility="Vertical"/>
</DockPanel>

虽然我用它生成DataGrid的c#是这样的:

Oggetto oggetto = new Oggetto();
Oggetti.Add( new Oggetto() { } );

dg_Misc.ItemsSource = Oggetti;
dg_Misc.Items.Refresh();

在Oggetto类中,我有两个字符串,Name和Description,当生成DataGrid时,它们成为列的两个标题,我希望列Description的单元格能够启用文本换行。

2 个答案:

答案 0 :(得分:2)

利用AutoGeneratingColumn事件。

在XAML中,使用事件处理程序挂钩事件:

<DataGrid Name="dg_Misc" Margin="2" 
          Background="#FF212121" 
          SelectionUnit="Cell" 
          VerticalGridLinesBrush="Black" 
          GridLinesVisibility="Vertical"
          AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"/>

在代码后面实现你的事件处理程序:

private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.Column.Header.ToString() == "Description")
    {
        var col = e.Column as DataGridTextColumn;

        var style = new Style(typeof(TextBlock));
        style.Setters.Add(new Setter(TextBlock.TextWrappingProperty, TextWrapping.Wrap));
        style.Setters.Add(new Setter(TextBlock.VerticalAlignmentProperty, VerticalAlignment.Center));

        col.ElementStyle = style;
    }
}

我还添加了一个VerticalAlignment中心,所以它看起来更好。随意评论/删除该行。

答案 1 :(得分:1)

您应该自己定义DataGrid的列。

<DataGrid Name="dg_Misc" Margin="2" Background="#FF212121" SelectionUnit="Cell" VerticalGridLinesBrush="Black" GridLinesVisibility="Vertical"
          AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}" />

        <DataGridTemplateColumn Header="Description">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate DataType="{x:Type local:Oggetto}">
                    <TextBlock Text="{Binding Description}" TextWrapping="Wrap" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

我添加了AutoGenerateColumns="False",因此我们最终不会有四列,只有我在上面定义的列。

然后我定义了两列。

  1. 首先是一个简单的DataGridTextColumnBinding设置为Name属性。

  2. 第二个是DataGridTemplateColumn,我可以自己定义列的模板。我已将TextBlock设置为Binding设置为DesciriptionTextWrapping="Wrap",以实现您想要的功能。