使用 WPFLocalizationExtension 的 DataTemplate 本地化

本文关键字:本地化 DataTemplate WPFLocalizationExtension 使用 | 更新日期: 2023-09-27 18:34:04

我正在使用WPFLocalizationExtension来本地化C#/。Net4.5应用程序,但我无法使用自定义DataTemplate本地化下拉菜单,因为我无法使用DisplayMemberPath。对于普通的下拉本地化,其工作原理如下:

<telerik:RadComboBox ItemsSource="{Binding GlassColors}" 
                     SelectedValue="{Binding Ampule.ID_GlassColor, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" 
                     SelectedValuePath="ID_GlassColor" 
                     DisplayMemberPath="{lang:Loc dmp_GlassColor}"/>

上面的ComboBox示例链接到包含语言的数据库表。显示的语言由本地化DisplayMemberPath更改。这种方法非常简单,我可以推荐给其他人。它如何不适用于使用自定义DataTemplate的组合框.请参阅以下示例:

<telerik:RadComboBox ItemsSource="{Binding PackagingTypesFilter}" 
                     SelectedValue="{Binding SelectedPackagingTypeFilter}"          
                     SelectedValuePath="ID_PackagingType">
    <telerik:RadComboBox.ItemTemplate>
        <DataTemplate DataType="{x:Type model:Tbl_PackagingMaster_ID_PackagingType}">
            <Grid VerticalAlignment="Center" HorizontalAlignment="Left">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="24" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Image Source="{Binding TypeIcon, Converter={StaticResource StringToUriConverter}}" VerticalAlignment="Top" Grid.Column="0" Height="14" Margin="2" />
                <TextBlock Text="{Binding PackagingTypeDescription}" Style="{StaticResource TextBlockMediumSmallBlackStyle}" Grid.Column="1"/>
            </Grid>
        </DataTemplate>
    </telerik:RadComboBox.ItemTemplate>
</telerik:RadComboBox>

ItemSource是一个Collection,其中PackagingTypeDescription包含英语,PackagingTypeDescriptionGerman包含德语描述。

如何本地化上面的代码示例?

使用 WPFLocalizationExtension 的 DataTemplate 本地化

我用TemplateSelector解决了这个问题。

这是TemplateSelector类:

using System.Windows;
using System.Windows.Controls;
namespace Common.TemplateSelector
{
    public class LanguageTemplateSelector : DataTemplateSelector
    {
        public DataTemplate TemplateEnglish { get; set; }
        public DataTemplate TemplateGerman { get; set; }
        public const string LanguageIdentifier = "de";
        public override DataTemplate SelectTemplate(object item, DependencyObject container)
        {
            return Configuration.Configuration.Language == LanguageIdentifier ? this.TemplateGerman : this.TemplateEnglish;
        }
    }
}

这里是模板定义和<UserControl.Resources></UserControl.Resources>区域中定义的TemplateSelector定义:

<DataTemplate DataType="{x:Type model:Tbl_PackagingMaster_ID_PackagingType}" x:Key="PackagingTypeEnglish">
    <Grid VerticalAlignment="Center" HorizontalAlignment="Left">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="24" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Image Source="{Binding TypeIcon, Converter={StaticResource StringToUriConverter}}" VerticalAlignment="Top" Grid.Column="0" Height="14" Margin="2" />
        <TextBlock Text="{Binding PackagingTypeDescription}" Style="{StaticResource TextBlockMediumSmallBlackStyle}" Grid.Column="1"/>
    </Grid>
</DataTemplate>
<DataTemplate DataType="{x:Type model:Tbl_PackagingMaster_ID_PackagingType}" x:Key="PackagingTypeGerman">
    <Grid VerticalAlignment="Center" HorizontalAlignment="Left">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="24" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Image Source="{Binding TypeIcon, Converter={StaticResource StringToUriConverter}}" VerticalAlignment="Top" Grid.Column="0" Height="14" Margin="2" />
        <TextBlock Text="{Binding PackagingTypeDescriptionGerman}" Style="{StaticResource TextBlockMediumSmallBlackStyle}" Grid.Column="1"/>
    </Grid>
</DataTemplate>
<templateSelector:LanguageTemplateSelector x:Key="PackagingTypeLanguageSelector"
                                           TemplateEnglish="{StaticResource PackagingTypeEnglish}" 
                                           TemplateGerman="{StaticResource PackagingTypeGerman}" />

这就是我将其用于ComboBox的方式:

<telerik:RadComboBox ItemsSource="{Binding PackagingTypesFilter}"
                     SelectedValue="{Binding SelectedPackagingTypeFilter}"      
                     SelectedValuePath="ID_PackagingType"
                     ItemTemplateSelector="{StaticResource PackagingTypeLanguageSelector}" />

但是,我仍在寻找一种更优雅的方法来解决这个问题。