【问题标题】:WPF Datagrid Cell Text WrappingWPF Datagrid 单元格文本换行
【发布时间】:2018-04-29 04:50:15
【问题描述】:

我有一个具有自定义样式的数据网格,因此我可以在整个应用程序中重复使用这种格式。它有一个自定义的列标题样式、行样式等。我能够让文本换行在列标题上工作,并且数据正确绑定到它。当我尝试在单元格上使用相同的技术时,绑定似乎不起作用,但包装确实起作用。我已阅读以下帖子,但似乎每次放置数据网格后都需要设置样式。不能在资源字典中完成还是我在错误的位置应用了包装?

wpf DataGrid change wrapping on cells

WPF toolkit datagrid cell text wrapping

WPF DataGrid Cell Text Wrapping - set to NoWrap (False)

这里是数据网格定义(修剪):

<Style x:Key="EmbedDG" TargetType="{x:Type DataGrid}" >
    <Setter Property="ColumnHeaderStyle" Value="{DynamicResource DGCH}" />
    <Setter Property="CellStyle" Value="{DynamicResource EmbedDGCE}" />
</Style>    

这是显示文本环绕的工作 DGCH 样式:

<Style x:Key="DGCH" TargetType="{x:Type DataGridColumnHeader}">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock TextWrapping="Wrap" Text="{Binding}" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

这是不起作用的单元格样式(图 1 有 contenttemplate,2 没有):

<Style x:Key="EmbedDGCE" TargetType="{x:Type DataGridCell}">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock TextWrapping="Wrap" Text="{Binding}" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

编辑:

<DataGrid Style="{DynamicResource EmbedDG}" ItemsSource="{Binding Tags}" >
      <DataGrid.Columns>
          <DataGridTextColumn Header="Tag Type" Binding="{Binding TagType}" Width="180" />
          <DataGridTextColumn Header="Tag Comments" Binding="{Binding Message}" Width="300"/>
      </DataGrid.Columns>
</DataGrid>

【问题讨论】:

  • 图片 2 有一个固定的宽度,恰好容纳了单元格中的所有文本。如果宽度更小,文本将不会换行。只是一些澄清。
  • “路径变得混乱”、“在我放置数据网格之后”、“绑定无效”——你能澄清一下这些短语的含义吗?
  • 我最初从图 2 开始。它采用该集合并绑定元素:名称字符串和消息字符串。它可以工作,但消息字符串对于宽度来说太长了,我想包装消息。这就是我添加自定义单元格样式以应用文本换行(如列标题)的时候。应用单元格样式后,绑定中的数据是集合的名称,而不是集合的属性(图 1)。
  • 所以你在用这些风格做某事。请显示 XAML。我不需要担心“放置数据网格”吗?
  • 添加了自定义dg的xaml。

标签: wpf xaml datagrid resourcedictionary


【解决方案1】:

我会摆脱单元格样式并使用模板列。

<DataGrid Style="{DynamicResource EmbedDG}" ItemsSource="{Binding Tags}" >
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Tag Type" Width="180">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock 
                        Text="{Binding TagType}" 
                        TextWrapping="Wrap"
                        />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTemplateColumn Header="Tag Comments" Width="300">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <TextBlock 
                        Text="{Binding Message}" 
                        TextWrapping="Wrap"
                        />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

我想它给了你完全限定的类名,因为你的单元格模板试图在 TextBlock 中显示一个对象。我没有时间玩它,但是无论您的代码中存在什么问题,以上都应该有效。

【讨论】:

  • 这是我在多个论坛上看到的,但希望我可以做一些更高的原始设置。我想这不是什么大问题,但要求任何时候我需要为列包装文本,我必须添加额外的样板代码进行包装。希望只是应用一种样式并完成它。你碰巧知道其他方法吗?
  • 我正在离开办公室。
  • 我找不到更好的方法,所以就按照你的方法。
猜你喜欢
  • 2011-05-11
  • 1970-01-01
  • 2017-08-07
  • 2015-11-19
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多