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