如何绑定(bind) 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>
结果应根据 Lang 属性:
2011年4月1日 - 2011年4月1日 en-US
或 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)));
它将整个应用程序的 Language
属性的默认值覆盖为当前区域性。
编辑:好吧,我误解了你的问题......
如果要将 Language
属性绑定(bind)到包含 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" />
并在绑定(bind)中使用转换器:
<TextBlock Language="{Binding Lang, Converter={StaticResource languageConverter}}">
关于WPF XML :lang/Language binding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5606789/