【问题标题】:Enum binding with converter枚举与转换器绑定
【发布时间】:2016-09-19 22:02:15
【问题描述】:

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

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

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

类似:

<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.

怎么了?

【问题讨论】:

    标签: wpf xaml enums


    【解决方案1】:

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

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

    并相应地使用:

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

    错误“IValueConverter 的 TypeConverter 不支持从字符串转换”表示 wpf 没有将字符串“languageConverter”识别为转换器

    使用Binding的StringFormat属性也可以达到同样的效果,不用转换器:

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

    【讨论】:

      猜你喜欢
      • 2020-12-11
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 2018-02-21
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      相关资源
      最近更新 更多