默认自定义DataGrid控件中的子控件样式

时间:2016-09-26 08:57:20

标签: c# wpf datagrid wpf-controls wpf-style

我正在开发一个自定义DataGrid控件,该控件源自标准WPF DataGrid,以根据客户特定需求扩展它。

我的.cs文件的摘录:

public class DataGrid : System.Windows.Controls.DataGrid
{
    #region Constructor
    static DataGrid()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(DataGrid),
            new FrameworkPropertyMetadata(typeof(DataGrid)));
    }
}

我的.xaml文件的摘录:

<Style TargetType="local:DataGrid"
       BasedOn="{StaticResource ResourceKey={x:Type DataGrid}}">

如果不在x:Key标记上使用Style,我会将此样式声明为控件的默认样式。这符合我的预期。

我没有得到的是我如何正确声明DataGrid使用的子控件的默认样式,例如DataGridRowDataGridColumnDataGridColumnHeader

一种方法就是宣布这样......

<Style TargetType="{x:Type DataGridRow}">

...并明确设置CellStyle的{​​{1}}(否则由于某种原因仍然使用标准的WPF样式(?))

local:DataGrid

当客户在本地使用此自定义<Setter Property="CellStyle" Value="{StaticResource {x:Type DataGridCell}}"/> 时,他们可以通过简单引用DataGrid来修改样式,我发现它非常优雅:

{x:Type DataGridCell}

将其声明为默认样式的缺点是,当客户端使用标准WPF <local:DataGrid> <lolcal:DataGrid.CellStyle> <Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}"> 时,默认样式会被我的自定义DataGrid覆盖。

另一种方法是在指定我的DataGrid样式时使用x:Key属性...

DataGridCell

...并将<Style x:Key="DataGridCellStyleKey" TargetType="{x:Type DataGridCell}"> 的{​​{1}}设置为此密钥

CellStyle

这样我就不会覆盖默认样式,但是当我的客户想要在本地修改CellStyle时,他们需要明确地引用local:DataGrid

<Setter Property="CellStyle" Value="{StaticResource {x:Type DataGridCell}}" />

出于简单性和可维护性的原因,我想避免引用x:Key

我正在寻找的是一种结合了两种解决方案中最佳解决方案的方法:将<local:DataGrid> <local:DataGrid.CellStyle> <Style TargetType="DataGridCell" BasedOn="{StaticResource DataGridCellStyleKey}"> 设置为默认样式以避免引用硬编码的x:Key字符串,同时避免覆盖默认值标准WPF Row/CellStyles的样式。我能想到的唯一其他解决方案是使用x:Key和其他子控件的自定义控件。这是一个可行的解决方案吗?

1 个答案:

答案 0 :(得分:0)

我认为您必须在自定义DataGrid的默认样式范围内声明第一种方法的样式,如下所示:

<Style TargetType="local:DataGrid" BasedOn="{StaticResource ResourceKey={x:Type DataGrid}}">
    <Setter Property="CellStyle">
        <Setter.Value>
            <Style TargetType="DataGridCell">
                <!-- Your Default Style here -->
            </Style>
        </Setter.Value>
    </Setter>
</Style>

这不会覆盖默认的DataGrids CellStyle,并且可以由用户轻松更改。