我正在使用WPFLocalizationExtension作为我的WPF应用程序。我有一个用于语言选择的ComboBox。项目源是一个ObservableCollection<KeyValuePair<string, string>>,如下所示:
TITLE_LANGUAGE_ENGLISH:enTITLE_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”属性上。“绑定”只能设置在DependencyProperty的DependencyObject上
如何翻译ItemTemplate?
谢谢,
发布于 2018-07-09 15:08:54
您可以同时使用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提供上下文。
发布于 2018-07-09 11:22:00
您必须直接绑定到路径Key。TextBlock at 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>更新:
也许你得加个转换器。尝试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>https://stackoverflow.com/questions/51222726
复制相似问题