在哪里为XAML中集合的项设置转换器

本文关键字:设置 转换器 集合 XAML 在哪里 | 更新日期: 2023-09-27 18:10:22

我刚刚制作了第一个转换器,将整型转换为字符串。我有一个用整数(年)填充的组合框,但如果值为0,我希望组合框显示'All'。

这是我的转换器:

public class IntToString : IValueConverter
{
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                int intY = (int)value;
                if (intY == 0)
                {
                    String strY = "All";
                    return strY;
                }
                else
                {
                    return intY.ToString();
                }
            }
            return String.Empty;
        }
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
        }
    }

在XAML中我应该在哪里设置转换器?我尝试在组合框的ItemsSource:

ItemsSource="{Binding YearsCollection, Converter={StaticResource intToStringYearConverter}}"

但是这一行我总是得到InvalidcastException

int intY = (int)value;

在哪里为XAML中集合的项设置转换器

问题是您试图转换整个集合而不是集合中的一个项目。

你会想这样做:

<ListBox ItemsSource="{Binding YearsCollection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
             <Border DataContext="{Binding Converter={StaticResource intToStringYearConverter}">
             ...
             </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

您不能像这样使用转换器,ItemsSource中的转换器应该转换整个集合,而不是单个项目。集合对象不能强制转换为整型,因此会得到异常。

您必须使用DataTemplate并对单个项目应用转换器。

或者——如果你需要的只是强制转换为整型——你可以使用ItemStringFormat。

另外,当源为空时,您可以使用绑定的TargetNullValue属性来设置默认消息。