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单元设置为居中放置,并使用与同一文件一起使用的某些代码隐藏,使这些单元一次单击即可进入编辑模式。在本地指定新样式会丢失此内容。如果尝试基于全局指定新的本地样式,则会出现异常
我尝试将全局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> |