使用ItemTemplate的WPFLocalizationExtension

时间:2018-07-07 11:26:30

标签: wpf xaml wpflocalizationextension

我正在将WPFLocalizationExtension用于我的WPF应用程序。 我有一个ComboBox用于语言选择。物品来源是ObservableCollection<KeyValuePair<string, string>>,如下所示:

  • TITLE_LANGUAGE_ENGLISHen
  • TITLE_LANGUAGE_VIETNAMESEvi-VN

这是我的xaml代码:

<TextBlock Text="{lex:Loc TITLE_LANGUAGE}"></TextBlock>
<ComboBox Grid.Column="1" 
          ItemsSource="{Binding AvailableLanguages}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{lex:Loc Key={Binding Key}}"></TextBlock>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

当我运行该应用程序时,它抛出了一个异常:

  

不能在“ LocExtension”类型的“ Key”属性上设置“ Binding”。只能在DependencyObject的DependencyProperty上设置“绑定”

如何翻译ItemTemplate

谢谢

2 个答案:

答案 0 :(得分:1)

您可以将IMultiValueConverterMultiBinding结合使用,以免失去即时更新本地化的能力。

<ComboBox ItemsSource="{Binding AvailableLanguages}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <TextBlock.Text>
                    <MultiBinding>
                        <MultiBinding.Bindings>
                            <Binding Path="Key" Mode="OneTime"/>
                            <Binding Path="Culture" Source="{x:Static lex:LocalizeDictionary.Instance}"/>
                        </MultiBinding.Bindings>
                        <MultiBinding.Converter>
                            <l:TranslateMultiConverter/>
                        </MultiBinding.Converter>
                    </MultiBinding>
                </TextBlock.Text>
            </TextBlock>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

这是转换器:

class TranslateMultiConverter : DependencyObject, IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Length == 2)
        {
            var key = values[0] as string;
            if (key == null)
            {                
                return DependencyProperty.UnsetValue;
            }

            var cultureInfo = (values[1] as CultureInfo) ?? culture;

            return LocalizeDictionary.Instance.GetLocalizedObject(key, this, cultureInfo);
        }

        return values.FirstOrDefault();
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

当应用的语言发生变化,导致LocalizeDictionary刷新值时,PropertyChanged将引发MultiBinding事件。

请注意,转换器也是DependencyObject。这是为了在调用LocalizeDictionary方法时为GetLocalizedObject提供上下文。

答案 1 :(得分:0)

您必须直接绑定到路径KeyTextBlock处的DataTemplate指向单个KeyValuePair对象,您可以直接访问属性Key

<TextBlock Text="{lex:Loc TITLE_LANGUAGE}"></TextBlock>
    <ComboBox Grid.Column="1" 
      ItemsSource="{Binding AvailableLanguages}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Key}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

更新

也许您必须添加一个Converter。尝试WPFLocalizeExtension.TypeConverters.DefaultConverter或自己实现一个源自IValueConverter的类。

<ComboBox.Resources>
    <cv:DefaultConverter x:Key="DConv" />
</ComboBox.Resources>
<ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Key, Converter={StaticResource DConv}}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>