Wpf IValueConverter执行的次数超出预期

Wpf IValueConverter执行的次数超出预期,wpf,wpfdatagrid,ivalueconverter,Wpf,Wpfdatagrid,Ivalueconverter,我有一个转换器,它从组成DataGridCell的TextBlock中提取文本,并根据值是负值还是正值将其转换为红色或黑色画笔。但是,转换器执行的次数比网格数据源中的项目多。例如,如果我只绑定一个包含1个对象的集合,转换器将执行2次。第一次value参数是空字符串,第二次它实际包含我期望的值。如果我向列表中添加更多对象,则初始“空”执行的数量会增加。我做错了什么 <Window.Resources> <conv:NumericValueBrushColorConvert

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

[ValueConversion(typeof(string)、typeof(SolidColorBrush))]
内部类NumericValueBrushColorConverter:IValueConverter
{
静态int i=0;
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
string strValue=作为字符串的值;
i++;
if(string.IsNullOrEmpty(strValue))返回新的SolidColorBrush(Colors.Black);
if(strValue.StartsWith(“”)
{
返回新的SolidColorBrush(颜色为红色);
}
其他的
{
返回新的SolidColorBrush(颜色为黑色);
}
}
...
}   

首先创建网格行中的文本块,因此为空(=第一次执行),然后将内容绑定到当前项的值(=第二次执行)。这里没有问题。

首先创建网格行中的文本块,因此为空(=第一次执行)然后将内容绑定到当前项的值(=第二次执行)。这里没有问题。

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

我希望@Daniel Hilgarth是正确的。您应该在尝试转换之前检查转换器中的值。您可以返回Binding.DoNot当你不想运行绑定时,我会发出警告。

事实上,只要检查string.IsNullOrEmpty(value)是否为true并返回。有趣的是,如果我将315个项绑定到网格,则只有27个空调用。这不是和有项(行)的数字相同吗在绑定列表中?这很奇怪,我没有解释,抱歉。只有可查看的项目运行绑定。@e36M3:为了优化性能,WPF只计算屏幕上当前可见的对象的绑定。我非常确定,您的网格一次只显示27个项目,您必须滚动网格才能查看更多项目。这就是Josh对“可视”的意思。事实上,只要检查string.IsNullOrEmpty(值)是否为true并返回。有趣的是,如果我将315个项绑定到网格,则只有27个空调用。这不是与项(行)数相同的数字吗在绑定列表中?这很奇怪,我没有解释,抱歉。只有可查看的项目运行绑定。@e36M3:为了优化性能,WPF只计算屏幕上当前可见的对象的绑定。我非常确定,您的网格一次只显示27个项目,您必须滚动网格才能查看更多项目。这就是Josh所说的“可视”的意思。