我正在将WPFLocalizationExtension
用于我的WPF应用程序。
我有一个ComboBox
用于语言选择。物品来源是ObservableCollection<KeyValuePair<string, string>>
,如下所示:
TITLE_LANGUAGE_ENGLISH
:en
TITLE_LANGUAGE_VIETNAMESE
:vi-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
?
谢谢
答案 0 :(得分:1)
您可以将IMultiValueConverter
与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
刷新值时,PropertyChanged
将引发MultiBinding
事件。
请注意,转换器也是DependencyObject
。这是为了在调用LocalizeDictionary
方法时为GetLocalizedObject
提供上下文。
答案 1 :(得分:0)
您必须直接绑定到路径Key
。 TextBlock
处的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>