gpt4 book ai didi

c# - DataGrid中自动生成列为真时如何进行文本换行

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:00 26 4
gpt4 key购买 nike

我有一个带有自动生成列的 DataGrid 是真的,因为它的列是从 View 模型中动态添加的。我仍然想启用文本换行,因为在调整列的大小时文本被隐藏了。

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;
}

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

最佳答案

实现您想要的唯一方法是处理 AutoGeneratingColumn event .来自DataGrid.AutoGenerateColumns Property MSDN 上的页面:

When the AutoGenerateColumns property is set to true, the AutoGeneratingColumn event will be raised for each column that is created. You can change or cancel the column being created in the AutoGeneratingColumn event handler.

<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 并添加一个 TextBlock 上设置了 TextWrapping="Wrap"。请查看 WPF DataGrid: How do I set columns to TextWrap? 的答案问题以了解如何做到这一点。

关于c# - DataGrid中自动生成列为真时如何进行文本换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24610907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com