如何覆盖ResourceDictionary中指定的DataGridColumnHeader?

时间:2015-08-06 17:05:56

标签: c# wpf datagrid datagridcolumnheader

所以我试图覆盖ResourceDictionary中定义的模板中的默认值。保留默认对齐方式,但我希望左侧列标题与右侧列标题对齐,右侧列标题与左侧对齐。其余数据排列很好。

目前,这就是我所拥有的:

<ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="../Controls/CustomDataGrid.xaml" />
        </ResourceDictionary.MergedDictionaries>

        <Style x:Key="CellTextStyleR" TargetType="TextBlock">
            <Setter Property="TextWrapping" Value="Wrap"/>
            <Setter Property="TextAlignment" Value="Right"/>
            <Setter Property="Margin" Value="2,0,5,0"/>
        </Style>
        <Style x:Key="CellTextStyleL" TargetType="TextBlock">
            <Setter Property="TextWrapping" Value="Wrap"/>
            <Setter Property="TextAlignment" Value="Left"/>
            <Setter Property="Margin" Value="5,0,0,0"/>
        </Style>

        <Style x:Key="HeaderRight" TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource DataGridColumnHeaderStyle}">
            <Setter Property="HorizontalContentAlignment" Value="Right"/>
            <Setter Property="Margin" Value="2,0,5,0"/>
        </Style>

        <Style x:Key="HeaderLeft" TargetType="{x:Type DataGridColumnHeader}" BasedOn="{StaticResource DataGridColumnHeaderStyle}">
            <Setter Property="HorizontalContentAlignment" Value="Left"/>
            <Setter Property="Margin" Value="5,0,0,0"/>
        </Style>

    </ResourceDictionary>
</UserControl.Resources>

<Grid>


    <DataGrid Grid.Row="0" Grid.Column="1" Style="{StaticResource CustomDataGridStyle}" ItemsSource="{Binding InputDataCollection}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Input Name" Binding="{Binding Name}" Width="50*" ElementStyle="{StaticResource CellTextStyleR}" HeaderStyle="{StaticResource HeaderRight}"/>
            <DataGridTextColumn Header="Input State" Binding="{Binding State}" Width="50*" ElementStyle="{StaticResource CellTextStyleL}" HeaderStyle="{StaticResource HeaderLeft}"/>
        </DataGrid.Columns>
    </DataGrid>

相反,列文本保持左对齐。

我也尝试直接在datagrid中定义,但这只会杀死所有格式......

有没有办法覆盖对齐和边距,而不会删除所有其他格式?

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

对于单元格,请尝试Control.HorizontalAlignment,如下所示:

<Style x:Key="CellRightAlign">
    <Setter Property="Control.HorizontalAlignment"
            Value="Right" />
</Style>

<Style x:Key="CellLeftAlign">
    <Setter Property="Control.HorizontalAlignment"
            Value="Left" />
</Style>

<DataGrid Grid.Row="0" Grid.Column="1" Style="{StaticResource CustomDataGridStyle}" ItemsSource="{Binding InputDataCollection}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Input Name" Binding="{Binding Name}" Width="50*" ElementStyle="{StaticResource CellRightAlign}" HeaderStyle="{StaticResource HeaderRight}"/>
            <DataGridTextColumn Header="Input State" Binding="{Binding State}" Width="50*" ElementStyle="{StaticResource CellLeftAlign}" HeaderStyle="{StaticResource HeaderLeft}"/>
        </DataGrid.Columns>
    </DataGrid>

对于标题,您可能需要删除BasedOn。我在你的问题中看不到那些风格......

答案 1 :(得分:0)

在敲击键盘之后,这是我最终解决的问题:

我改变了样式&#34; HeaderLeft&#34;和#34; HeaderRight&#34;这样他们就不再基于CustomDataGrid.xaml的DataGridColumnHeaderStyle。

相反,我将DataGridColumnHeaderStyle中的内容复制粘贴到这些样式中,并更改了我需要更改的设置。

不是我希望的优雅解决方案,但嘿,如果有效......