IValueConverter执行的次数比预期的多

时间:2011-12-08 15:21:39

标签: wpf wpfdatagrid ivalueconverter

我有一个转换器,它从构成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);
        }
    }
    ...
}   

2 个答案:

答案 0 :(得分:3)

好吧,首先创建网格行中的TextBlock,然后清空(=第一次执行),然后将内容绑定到当前项的值(=第二次执行)。这里没有错。

答案 1 :(得分:2)

我希望@Daniel Hilgarth是对的。在尝试转换之前,您应该检查转换器中的值。当您不希望绑定运行时,可以返回Binding.DoNothing。