在XAML中为集合的项目设置Converter的位置

时间:2011-10-03 12:48:03

标签: c# wpf xaml converter

我刚刚将第一个转换器从int转换为string。我有一个带有整数的组合框填充(年),但如果值为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 个答案:

答案 0 :(得分:7)

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

你会想做这样的事情:

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

答案 1 :(得分:2)

你不能像这样使用转换器,ItemsSource中的转换器应该转换整个集合,而不是单个项目。集合对象不能转换为整数,因此您将获得异常。

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

或者 - 如果您需要的所有内容都被转换为int - 您可以使用ItemStringFormat

此外,要在源为null时设置默认消息,可以使用绑定的TargetNullValue属性。