如何在Xceed WPF数据网格单元格上设置ContentTemplate?

时间:2014-03-06 22:35:07

标签: wpf datagrid xceed

我们有一些代码成功地使用了Xceed的WPF datagrid v.3.8。当我们更新到他们的v.5.2数据网格时,我们丢失了一个功能。我想要做的就是将网格列标题标题包装为两行。我们在列管理器单元上设置了一个ContentTemplate来执行此操作,它适用于应用程序启动。但是,当您将列标题从屏幕滚动然后再返回视图时,ContentTemplate格式似乎会丢失。

正如我所说,相同的代码适用于早期版本的网格。 Xceed不会帮助我们解决这个问题,因为我们在Windows窗体上托管WPF网格(这是他们首先提出的建议)。

Xceed数据网格位于.XAML UserControl上。在UserControl.Resources中,我像这样定义DataTemplate:

<DataTemplate x:Key="columnManagerCellContentTemplate">
    <TextBlock Text="{Binding}" TextWrapping="WrapWithOverflow" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</DataTemplate>

我为ColumnManagerCell定义了一个Style来设置一个ColumnManagerCell加载的事件处理程序:

<Style TargetType="{x:Type xcdg:ColumnManagerCell}">
     <EventSetter Event="Loaded" Handler="ColumnManagerCell_Loaded"/>
</Style>

在用户控件的.XAML.cs文件中,我有ColumnManagerCell_Loaded事件处理程序,它将ContentTemplate分配给ColumnManagerCells:

internal void ColumnManagerCell_Loaded(object sender, RoutedEventArgs e)
{
    ColumnManagerCell columnManagerCell = sender as ColumnManagerCell;

    if (columnManagerCell != null)
    {
        if (columnManagerCell.ContentTemplate == null)
        {
            columnManagerCell.ContentTemplate = (DataTemplate)this.FindResource("columnManagerCellContentTemplate");
        }
    }
}

这是很久以前Xceed记录的所有代码。正如我所说,当我启动应用程序时,它可以正确地将长列标题包装为2行。但是,当我将列标题滚动到视图之外然后返回视图时,格式化就消失了。

我还可以在DataTemplate中设置TextBlock的背景颜色,它在启动时起作用,然后在将标题滚出视图后也会消失。

任何人都有关于如何让这些设置持续存在的任何建议?我尝试在TextBlock上设置一个IsVisibleChanged事件处理程序并重置该处理程序中的TextWrapping属性(我看到那时它是“无”),但这并没有改变这种情况。

任何建议表示赞赏。

谢谢,

标记

2 个答案:

答案 0 :(得分:0)

您可以覆盖默认模板并设置ContentTemplate以反映您的要求。这些包含在Xceed安装中(在主题文件夹下)。

如果找到包含ColumnManagerCell模板的.xaml,则可以复制此文件并根据需要进行修改。例如,下面的代码段用于为列标题提供语言翻译功能:

<StackPanel x:Name="contentPanel" Orientation="Horizontal">
  <!-- Same ContentPresenter as in the base Cell Template. -->
  <!--<xcdg:CellContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />-->
  <!--The following contentpresenter uses the language converter -->
  <ContentPresenter>
    <ContentPresenter.Content>
      <TextBlock Text="{TemplateBinding Content, Converter={StaticResource LanguageTranslationConverter}}"/>
    </ContentPresenter.Content>
  </ContentPresenter>    

  <ContentPresenter x:Name="sortGlyphPresenter"
                    Content="{x:Null}"
                    ContentTemplate="{x:Null}" />

  <ContentPresenter x:Name="sortIndexGlyphPresenter"
                    TextBlock.Foreground="{TemplateBinding Foreground}"
                    Content="{Binding Path=(xcdg:Cell.ParentCell).ParentColumn.SortIndex, RelativeSource={RelativeSource Self}, Converter={StaticResource IntAdditionConverter}, ConverterParameter=1}"
                    ContentTemplate="{x:Null}"
                    Margin="3,0,0,0"
                    Visibility="Collapsed" />                                        
</StackPanel> 

因此,您可以使用所需的文本包装和/或背景来修改它​​。

答案 1 :(得分:0)

Net Dev在以下帖子中提供的答案提供了正确的方法: Styling the Xceed ColumnManagerCell

由于UI虚拟化,不应直接在单元格上设置属性,而应通过样式设置属性。例如:

     <Style TargetType="{x:Type xcdg:ColumnManagerCell}">
        <Setter Property="Template">
           <Setter.Value>
              <ControlTemplate TargetType="ContentControl">
                    <TextBlock Text="{TemplateBinding ContentControl.Content}"
                               TextWrapping="Wrap"
                               HorizontalAlignment="Center"
                               VerticalAlignment="Center" />
              </ControlTemplate>
           </Setter.Value>
        </Setter>
     </Style>