关于wpf:DataGrid基于全局CellStyle的CellStyle

DataGrid CellStyle based on global CellStyle

我有一个DataGrid,我想更改单个单元格的背景颜色。使用xaml进行搜索(例如,

1
2
3
4
5
<DataGridTextColumn.CellStyle>
    <Style>
        <Setter Property="Border.Background" Value="{Binding Converter={StaticResource ImportTableBackgroundColorConverter},ConverterParameter=GotName}" />
    </Style>
</DataGridTextColumn.CellStyle>

但是,在应用程序范围的ResourceDictionary中,我也有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<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似乎实现了IFrameworkInputElement。

因为我要向ValueConverter传递参数以使其标识单元格显示的字段,所以我无法将背景色的内容移至全局样式-我必须使整个行背景一起改变颜色。将全局样式复制到表中的每个列声明,以及可能也必须复制其后的代码,无论是从最初还是在以后的维护,都显得非常可怕。

有谁知道我怎样才能使样式继承起作用,或者知道在调用ValueConverter时我在哪一列?


非常奇怪的是,即我不明白为什么,原始方法失败了(即使DataGridCell明确实现了IFrameworkInputElement,因为我可以将前者转换为后者),但是如果继承的样式在与其继承的样式相同的ResourceDictionary中定义, 有用。 即

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<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>

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


您可能只需要使用BasedOn:

1
2
3
<Style BasedOn="{StaticResource GlobalCellStyle}">
    <Setter Property="Border.Background" Value="{Binding Converter={StaticResource ImportTableBackgroundColorConverter},ConverterParameter=GotName}" />
</Style>