DataGrid CellStyle基于全局CellStyle

时间:2016-03-23 23:38:14

标签: wpf xaml datagrid

我是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时我所在的列?

2 个答案:

答案 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>

在某些时候可能对其他人有用。