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

3
我刚刚编写了我的第一个将整数转换为字符串的转换器。我有一个下拉框,里面填充了整数(年份),但如果值为0,我希望下拉框显示“全部”。
这是我的转换器:
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;
2个回答

7
问题是你试图将整个集合进行转换,而不是仅转换集合中的一个元素。你需要像下面这样做:
<ListBox ItemsSource="{Binding YearsCollection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
             <Border DataContext="{Binding Converter={StaticResource intToStringYearConverter}">
             ...
             </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

2
你不能像这样使用转换器,ItemSource 中的转换器应该是要将整个集合进行转换,而不是单个项。集合对象不能被转换为整数类型,所以你会得到异常。
你需要使用 DataTemplate 并在单个项上应用转换器。
或者 - 如果你只需要将其转换为整数 - 你可以使用 ItemStringFormat
另外,如果需要在源为空时设置默认消息,则可以使用 Binding 的 TargetNullValue 属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接