1

我正在使用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”类型的“键”属性上设置“绑定”。只能在 DependencyObject 的 DependencyProperty 上设置“绑定”

我该如何翻译ItemTemplate

谢谢,

4

2 回答 2

2

您可以将 aIMultiValueConverter与 a 一起使用MultiBinding,这样您就不会失去即时更新本地化的能力。

<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将引发一个事件。PropertyChangedMultiBinding

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

于 2018-07-09T15:08:54.593 回答
0

您必须直接绑定到路径KeyTextBlockatDataTemplate直接指向单个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>

更新:

也许你必须添加一个转换器。尝试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>
于 2018-07-09T11:22:00.953 回答