我正在开发一个自定义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
使用的子控件的默认样式,例如DataGridRow
,DataGridColumn
或DataGridColumnHeader
。
一种方法就是宣布这样......
<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
和其他子控件的自定义控件。这是一个可行的解决方案吗?
答案 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,并且可以由用户轻松更改。