У меня есть конвертер, который берет текст из TextBlock, который составляет DataGridCell, и преобразует его в красную или черную кисть в зависимости от того, является ли значение отрицательным или положительным. Однако конвертер выполняется больше раз, чем есть элементы в источнике данных сетки. Например, если я просто связываю коллекцию, которая содержит 1 объект, конвертер выполняется 2 раза. В первый раз параметр value
представляет собой пустую строку, во второй раз он фактически содержит значение, которое я ожидал. Если я добавлю больше объектов в список, число начальных «пустых» выполнений возрастет. Что я делаю не так?
<Window.Resources>
<conv:NumericValueBrushColorConverter x:Key="NumericValueBrushColorConverter"></conv:NumericValueBrushColorConverter>
</Window.Resources>
<DataGrid ItemsSource="{Binding CashReport}" IsReadOnly="True">
<DataGrid.Columns>
<DataGridTextColumn Header="Beginning Cash Available" Binding="{Binding BeginningBalance, StringFormat={}{0:C}}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="HorizontalAlignment" Value="Right" />
<Setter Property="Foreground" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Text, Converter={StaticResource NumericValueBrushColorConverter}}"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
[ValueConversion(typeof(string), typeof(SolidColorBrush))]
internal class NumericValueBrushColorConverter : IValueConverter
{
static int i = 0;
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
string strValue = value as string;
i++;
if(string.IsNullOrEmpty(strValue)) return new SolidColorBrush(Colors.Black);
if (strValue.StartsWith("("))
{
return new SolidColorBrush(Colors.Red);
}
else
{
return new SolidColorBrush(Colors.Black);
}
}
...
}