首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于DataTemplate的WPFLocalizationExtension定位

基于DataTemplate的WPFLocalizationExtension定位
EN

Stack Overflow用户
提问于 2014-12-11 10:42:34
回答 1查看 526关注 0票数 0

我使用WPFLocalizationExtension来本地化C#/ .Net4.5应用程序,但由于不能使用DisplayMemberPath,所以无法使用自定义DataTemplate来本地化DropDown菜单。对于像这样的普通下拉本地化工作:

代码语言:javascript
复制
<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的组合框不起作用。见下面的例子:

代码语言:javascript
复制
<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包含德语描述。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-11 12:05:46

我用TemplateSelector解决了这个问题。

下面是TemplateSelector类:

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

在这里,模板定义和在TemplateSelector区域中定义的<UserControl.Resources></UserControl.Resources>定义如下:

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

代码语言:javascript
复制
<telerik:RadComboBox ItemsSource="{Binding PackagingTypesFilter}"
                     SelectedValue="{Binding SelectedPackagingTypeFilter}"      
                     SelectedValuePath="ID_PackagingType"
                     ItemTemplateSelector="{StaticResource PackagingTypeLanguageSelector}" />

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27420883

复制
相关文章

相似问题

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