我是DataGrid,我想更改单个单元格的背景颜色。在使用xaml(例如
)进行一些搜索后,这很简单<DataGridTextColumn.CellStyle>
<Style>
<Setter Property="Border.Background" Value="{Binding Converter={StaticResource ImportTableBackgroundColorConverter},ConverterParameter=GotName}" />
</Style>
</DataGridTextColumn.CellStyle>
但是,在app-wide ResourceDictionary中我也有
<Style TargetType="DataGrid" x:Key="GlobalCellStyle">
<!-- Cell style -->
<Setter Property="CellStyle">
<Setter.Value>
<Style TargetType="DataGridCell">
<!-- Single Click Editing -->
<EventSetter Event="PreviewMouseLeftButtonDown"
Handler="DataGridCell_PreviewMouseLeftButtonDown" />
<EventSetter Event="KeyDown" Handler="DataGridCell_KeyDown" />
<EventSetter Event="GotFocus" Handler="DataGridCell_GotFocus"/>
<!--body content datagrid cell vertical centering-->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>
这会将所有DataGrid单元格设置为其内容的中心,并且使用与同一文件一起使用的某些代码隐藏,使单元格在单击时进入编辑模式。在本地指定新样式会丢失此功能。如果我尝试根据全局指定新的本地样式,我会得到异常Can only base on a Style with target type that is base type 'IFrameworkInputElement'
。
我尝试将全局DataGridCell样式本身置于全局DataGrid样式之外并获得相同的错误。这是DataGridCell appearing to implement IFrameworkInputElement.
因为我将一个参数传递给ValueConverter以让它识别单元格正在显示哪个字段,所以我无法将我的背景颜色移动到全局样式 - 我必须要有整行背景颜色变化在一起。并且将全局样式复制到我的表中的每个列声明,以及可能也必须复制代码隐藏,最初看起来非常可怕,并且稍后要维护。
有没有人知道如何让样式继承工作,或者知道在调用ValueConverter时我所在的列?
答案 0 :(得分:0)
您可能只需要使用BasedOn:
<Style BasedOn="{StaticResource GlobalCellStyle}">
<Setter Property="Border.Background" Value="{Binding Converter={StaticResource ImportTableBackgroundColorConverter},ConverterParameter=GotName}" />
</Style>
答案 1 :(得分:0)
非常奇怪,即我不明白为什么,原始方法失败(即使DataGridCell明确实现了IFrameworkInputElement,因为我可以将前者转换为后者)但是如果继承的样式在与它的样式相同的ResourceDictionary中定义继承,它的工作原理。即
<Style TargetType="DataGridCell" x:Key="GlobalCellStyle">
<!-- Your DataGrid Cell style definition goes here -->
<!-- Single Click Editing -->
<EventSetter Event="PreviewMouseLeftButtonDown"
Handler="DataGridCell_PreviewMouseLeftButtonDown" />
<EventSetter Event="KeyDown" Handler="DataGridCell_KeyDown" />
<EventSetter Event="GotFocus" Handler="DataGridCell_GotFocus"/>
<!--body content datagrid cell vertical centering-->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<conv:ImportTableBackgroundColorConverter x:Key="ImportTableBackgroundColorConverter" />
<Style BasedOn="{StaticResource GlobalCellStyle}" TargetType="DataGridCell" x:Key="DOBCellStyle">
<Setter Property="Border.Background" Value="{Binding Converter={StaticResource ImportTableBackgroundColorConverter},ConverterParameter=GotDOB}" />
</Style>
在某些时候可能对其他人有用。