如何绑定Listbox或texblock的Language属性(或xml:lang属性).
我想在特定的语言设置中显示月份名称
例如:
<TextBlock x:Name="Date" xml:lang="{Binding Lang}">
<TextBlock.Text>
<MultiBinding StringFormat=" {0:dd.MMM.yyyy}-{1:dd.MMM.yyyy}">
<Binding Path="Date1"/>
<Binding Path="Date2"/>
</MultiBinding>
</TextBlock.Text>
Run Code Online (Sandbox Code Playgroud)
结果应该是郎属性:
2011年4月1日至2011年4月1日,美国
或01.Nis.2011 - 02.Nis.2011 tr-TR
要么 ....
它给出了XamlParseException:语言属性无法转换为System.Windows.Markup.XmlLanguage类型(这不是精确的错误文本.)
任何的想法?
在Startup应用程序的事件,添加此指令:
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
在XAML资源中声明转换器:
<local:IetfTagToXmlLanguageConverter x:Key="languageConverter" />
Run Code Online (Sandbox Code Playgroud)
并在绑定中使用转换器:
<TextBlock Language="{Binding Lang, Converter={StaticResource languageConverter}}">
Run Code Online (Sandbox Code Playgroud)