DataGridCell样式,如何引用单元格值绑定到转换器?

时间:2011-12-07 22:51:39

标签: wpf wpfdatagrid

我有一个转换器,它采用十进制值并将其转换为画笔(红色表示负数,黑色表示正输入)。我还创建了一个样式,我想要应用于将采用小数值的所有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

1 个答案:

答案 0 :(得分:2)

您可以(也可能应该)使用ElementStyle / EditingElementStyle属性 - 它们将允许您设置单元格内的TextBlockTextBox。 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)