首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPFLocalizationExtension与ItemTemplate

WPFLocalizationExtension与ItemTemplate
EN

Stack Overflow用户
提问于 2018-07-07 11:26:29
回答 2查看 603关注 0票数 1

我正在使用WPFLocalizationExtension作为我的WPF应用程序。我有一个用于语言选择的ComboBox。项目源是一个ObservableCollection<KeyValuePair<string, string>>,如下所示:

  • TITLE_LANGUAGE_ENGLISHen
  • TITLE_LANGUAGE_VIETNAMESEvi-VN

这是我的xaml代码:

代码语言:javascript
复制
<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”属性上。“绑定”只能设置在DependencyProperty的DependencyObject上

如何翻译ItemTemplate

谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-09 15:08:54

您可以同时使用IMultiValueConverterMultiBinding,这样您就不会失去动态更新本地化的能力。

代码语言:javascript
复制
<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>

这是转换器:

代码语言:javascript
复制
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提供上下文。

票数 2
EN

Stack Overflow用户

发布于 2018-07-09 11:22:00

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

代码语言:javascript
复制
<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>

更新:

也许你得加个转换器。尝试WPFLocalizeExtension.TypeConverters.DefaultConverter或自己实现从IValueConverter派生的类。

代码语言:javascript
复制
<ComboBox.Resources>
    <cv:DefaultConverter x:Key="DConv" />
</ComboBox.Resources>
<ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=Key, Converter={StaticResource DConv}}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51222726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档