我有一个转换器,它采用十进制值并将其转换为画笔(红色表示负数,黑色表示正输入)。我还创建了一个样式,我想要应用于将采用小数值的所有DataGridTextColumn
。如果我为每个DataGridTextColumn内联样式,我只需在绑定表达式中指定Datacontext上的相关属性即可。但是我不想内联样式并简单地将它作为资源,这样我就可以将CellStyle设置为资源。问题是我不知道在Foreground属性的值绑定中放入什么。我希望能够将它绑定到与其应用的单元格绑定的值。
这就是我所拥有的:
<Window.Resources>
<!-- This converter takes a decimal value and returns a brush -->
<conv:NumericValueBrushColorConverter x:Key="NumericValueBrushColorConverter"></conv:NumericValueBrushColorConverter>
<Style x:Key="CurrencyStyle" TargetType="DataGridCell">
<Setter Property="HorizontalAlignment" Value="Right" />
<Setter Property="Foreground" Value="{Binding WhatGoesHere, Converter={StaticResource NumericValueBrushColorConverter}}"></Setter>
</Style>
</Window.Resources>
<DataGrid ItemsSource="{Binding CashReport}">
<DataGrid.Columns>
<DataGridTextColumn Header="Beginning Cash Available" Binding="{Binding BeginningBalance, StringFormat={}{0:C}}" CellStyle="{StaticResource CurrencyStyle}" />
<DataGridTextColumn Header="Ending Cash Available" Binding="{Binding EndingBalance, StringFormat={}{0:C}}" CellStyle="{StaticResource CurrencyStyle}" />
</DataGrid.Columns>
</DataGrid>
更新#1
根据Jefim的建议,我应该尝试使用ElementStyle,因为它直接在渲染的TextBlock上工作,而不是(CellStyle)包含TextBlock的内容控件(无论是什么)。
<Style x:Key="CurrencyStyle" TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Right" />
<Setter Property="Foreground" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Text, Converter={StaticResource NumericValueBrushColorConverter}}"/>
</Style>
<DataGrid ItemsSource="{Binding CashReport}">
<DataGrid.Columns>
<DataGridTextColumn Header="Beginning Cash Available" Binding="{Binding BeginningBalance, StringFormat={}{0:C}}" ElementStyle="{StaticResource CurrencyStyle}" />
<DataGridTextColumn Header="Ending Cash Available" Binding="{Binding EndingBalance, StringFormat={}{0:C}}" ElementStyle="{StaticResource CurrencyStyle}" />
</DataGrid.Columns>
</DataGrid>
这似乎有效,但是当我跟踪我的转换器的Convert方法时,它似乎会触发大约28次左右,并将空值传递给Convert方法。之后,所有值都按预期流动。当网格渲染一切看起来正确时,没有空单元格。在没有值的情况下前20次执行我的转换器会是什么?
更新#2 我相信我目前的问题与原始问题无关,因此我将其移至:IValueConverter executes more times than expected
答案 0 :(得分:2)
您可以(也可能应该)使用ElementStyle
/ EditingElementStyle
属性 - 它们将允许您设置单元格内的TextBlock
和TextBox
。 E.g:
<Style x:Key="CurrencyStyle" TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Right" />
<Setter Property="Foreground" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Text, Converter={StaticResource NumericValueBrushColorConverter}}"/>
</Style>
<DataGrid ItemsSource="{Binding CashReport}">
<DataGrid.Columns>
<DataGridTextColumn Header="Beginning Cash Available" Binding="{Binding BeginningBalance, StringFormat={}{0:C}}" ElementStyle="{StaticResource CurrencyStyle}" />
<DataGridTextColumn Header="Ending Cash Available" Binding="{Binding EndingBalance, StringFormat={}{0:C}}" ElementStyle="{StaticResource CurrencyStyle}" />
</DataGrid.Columns>
</DataGrid>
<强>更新强>
将代码更新为问题更新#1中的相同代码,以便查看答案的人能够看到正确的代码版本(通过e36M3)