我有一个转换器,它从构成DataGridCell的TextBlock中获取文本,并将其转换为红色或黑色画笔,具体取决于值是负还是正。但是,转换器执行的次数比网格数据源中的项目多。例如,如果我只是绑定包含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);
}
}
...
}
答案 0 :(得分:3)
好吧,首先创建网格行中的TextBlock,然后清空(=第一次执行),然后将内容绑定到当前项的值(=第二次执行)。这里没有错。
答案 1 :(得分:2)
我希望@Daniel Hilgarth是对的。在尝试转换之前,您应该检查转换器中的值。当您不希望绑定运行时,可以返回Binding.DoNothing。