【问题标题】:How to do textwrapping when autogenerate columns is true in DataGrid在 DataGrid 中自动生成列为真时如何进行文本换行
【发布时间】:2014-07-07 12:43:50
【问题描述】:

我有一个带有自动生成列的 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;
}

但是现在有一个额外的问题。开始时有一个额外的列看起来像一个索引列。对此有何建议?

【问题讨论】:

  • 有人能建议为什么要添加多列而它应该只有两列...dg.Columns.Add(dgtc);
  • 请看我的第二次更新

标签: c# wpf datagrid


【解决方案1】:

实现您想要的唯一方法是处理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 以实现文本换行,而使用此方法您将无法做到这一点。

但是,还有另一种方法可以实现此目的,即您可以覆盖 DataGridCell 的默认 Style 并添加一个已设置 TextWrapping="Wrap"TextBlock。请查看WPF DataGrid: How do I set columns to TextWrap? 问题的答案,了解如何操作。

【讨论】:

  • 您为自动生成列共享的代码我如何设置 wrap 属性?
  • 我说 来自 MSDN 上的 DataGrid.AutoGenerateColumns 属性页面...它与您的答案无关,它只是演示了一种在 @987654334 时更改列的方法@ 属性为 True。继续阅读答案。
【解决方案2】:

根据你的进步,我通过这种方式找到了成功:

// Identify the column from its name in the header
if (e.Column.Header.ToString() == "Column To Wrap")
{
    // You can set properties for the column here, personally I
    // chose to set the column's width to a good default.
    e.Column.Width = DataGridLength.SizeToHeader;

    // Cast the column to a DataGridTextColumn
    if (e.Column is DataGridTextColumn textColumn)
    {
        // Create new style based on the existing one.  Adding a Setter to it
        // that turns on word-wrapping.
        var style = new Style(typeof(TextBlock), textColumn.ElementStyle);
        style.Setters.Add(new Setter(TextBlock.TextWrappingProperty, TextWrapping.Wrap));
        textColumn.ElementStyle = style;
    }               
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2017-04-23
    • 2014-08-26
    • 1970-01-01
    • 2019-08-18
    • 2014-05-07
    • 2010-12-31
    相关资源
    最近更新 更多