WPF xml:lang/语言绑定

问题描述 投票:0回答:3
wpf xaml binding
3个回答
5
投票

在应用程序的

Startup
事件中,添加以下指令:

FrameworkElement.LanguageProperty.OverrideMetadata(
    typeof(FrameworkElement),
    new FrameworkPropertyMetadata(
        XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

它将针对整个应用程序将

Language
属性的默认值覆盖为当前区域性。


编辑:好吧,我误解了你的问题......

如果要将

Language
属性绑定到包含
IetfLanguageTag
的字符串,则需要一个转换器:

[ValueConversion(typeof(string), typeof(XmlLanguage))]
public class IetfTagToXmlLanguageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string tag = value as string;
        if (tag == null)
            return Binding.DoNothing;
        return XmlLanguage.GetLanguage(tag);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        XmlLanguage lang = value as XmlLanguage;
        if (lang == null)
            return Binding.DoNothing;
        return lang.IetfLanguageTag;
    }
}

在 XAML 资源中声明转换器:

<local:IetfTagToXmlLanguageConverter x:Key="languageConverter" />

并在绑定中使用转换器:

<TextBlock Language="{Binding Lang, Converter={StaticResource languageConverter}}">

2
投票

您可以创建附加属性并使用它。

sealed class CultureBehavior
{
    public static DependencyProperty CultureProperty =
        DependencyProperty.RegisterAttached("Culture",
            typeof (string),
            typeof (CultureBehavior),
            new UIPropertyMetadata(OnCultureChanged));

    public static void SetCulture(FrameworkElement target, string value)
    {
        target.SetValue(CultureProperty, value);
    }

    public static string GetCulture(FrameworkElement target)
    {
        return (string) target.GetValue(CultureProperty);
    }

    private static void OnCultureChanged(DependencyObject target, DependencyPropertyChangedEventArgs args)
    {
        var element = target as FrameworkElement;
        if (element == null) return;

        element.Language = XmlLanguage.GetLanguage(args.NewValue.ToString());
    }
}

XAML

xmlns:local="clr-namespace:App.Utils"
....

<TextBlock Text="{Binding Repairs, StringFormat=c}"  local:CultureBehavior.Culture="{Binding CultureString}" />

0
投票

语言可以绑定到

CultureInfo
实例或
string
文化名称。

避免错误

属性“Language”的绑定不能使用目标元素的 Language 进行转换;如果需要区域性,则必须在 Binding 上显式指定 ConverterCulture

根据要求为该绑定设置 ConverterCulture:

<Setter Property="Language" Value="{Binding CurrentUICulture.Name, Source={x:Static threading:Thread.CurrentThread}, ConverterCulture={x:Static globalization:CultureInfo.InvariantCulture}}"/>

Source={x:Static threading:Thread.CurrentThread}
用作示例,如果语言绑定到 DataContext 中的属性,则应将其删除)

© www.soinside.com 2019 - 2024. All rights reserved.