Стиль DataGridCell, как ссылаться на значение ячеек для привязки к конвертеру? - PullRequest
0 голосов
/ 08 декабря 2011

У меня есть конвертер, который принимает десятичное значение и преобразует его в кисть (красный для отрицательного и черный для положительного ввода). Я также создал стиль, который хочу применить ко всем DataGridTextColumn, которые будут принимать десятичные значения. Если я встраиваю стиль для каждого DataGridTextColumn, я могу просто указать связанное свойство для Datacontext в выражении привязки. Однако я не хочу вставлять стиль и просто использовать его как ресурс, чтобы я мог установить CellStyle для ресурса. Проблема в том, что я не знаю, что добавить в Binding значения для свойства 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

Согласно предложению Джефима, я должен попытаться использовать 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 выполняется больше раз, чем ожидалось

1 Ответ

2 голосов
/ 08 декабря 2011

Вы можете (и, вероятно, должны) использовать свойства 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> 

UPDATE

Обновлен код до того же, что и в обновлении вопроса № 1, чтобы люди, которые смотрят на ответ, увидели правильную версию кода (по e36M3)

...