在应用程序的
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}}">
您可以创建附加属性并使用它。
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}" />
语言可以绑定到
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 中的属性,则应将其删除)