枚举与转换器绑定

时间:2016-09-19 13:46:38

标签: wpf xaml enums

我有Languages枚举。我的Model.Translations代表不同的语言翻译:

public ObservableCollection<LanguageValue> Translations { get; set; }
public class LanguageValue
    {
        public Language Key { get; set; }
        public string Value { get; set; }
    }

我希望我的视图在翻译中为每个项目都有标签 - 文本框列表。 但是在Label中我希望有类似"Caption ({0})"的东西,其中参数是语言名称(枚举到字符串表示)。本文本身来自Resources。

类似的东西:

<ItemsControl ItemsSource="{Binding Path=Translations}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid Margin="5,2,5,2">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="30*"/>
                            <ColumnDefinition Width="70*"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Grid.Column="0" x:Name="ItemLabel" VerticalAlignment="Center" 
                             Text="{Binding Path=Key, Converter=languageConverter, ConverterParameter={x:Static res:Resources.lblCaption}}" />
                        <TextBox Grid.Column="1" x:Name="ItemText" VerticalAlignment="Center" 
                             Text="{Binding Path=Value, Mode=TwoWay}" />
                    </Grid>                        
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>

我的语言转换器:

[ValueConversion(typeof(Language), typeof(string))]
public class LanguageToDisplayConverter : IValueConverter
{
    public object Convert(object value, Type t, object parameter, CultureInfo culture)
    {
        return string.Format(parameter.ToString(), ((Language)value).ToString());
    }

    public object ConvertBack(object value, Type t, object parameter, CultureInfo culture)
    {
        //I guess I don't need this anyway?
        return null;
    }
}

但我有错误:

The TypeConverter for "IValueConverter" does not support converting from a string.

有什么问题?

1 个答案:

答案 0 :(得分:1)

您应该将转换器声明为资源(在Window中,或App.xaml中的应用程序范围内):

<Window.Resources>
    <views:LanguageToDisplayConverter x:Key="languageConverter"/>
</Window.Resources>

并相应地使用:

Text="{Binding Path=Key, Converter={StaticResource languageConverter},  ...

错误“Typealverter for”IValueConverter“不支持从字符串转换”表示wpf无法将字符串“languageConverter”识别为转换器

使用Binding的StringFormat属性也可以实现相同的效果,没有转换器:

Text="{Binding Path=Key, StringFormat={x:Static res:Resources.lblCaption}}"