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