2011-04-09 132 views
2

如何绑定列表框或texblock的Language属性(或xml:lang属性)。WPF 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> 

结果应根据郎属性:

01.Apr.2011 - 01.Apr。 2011 EN-US

或01.Nis.2011 - 02.Nis.2011 TR-TR

或....

它给XamlParseException:语言属性不能转换为System.Windows.Markup.XmlLanguage类型(这不是确切的错误文本。 )

任何想法?

回答

6

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" /> 

一nd在绑定中使用转换器:

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

它已经覆盖处于启动。但我想在运行时动态更改所有TextBlock Language属性。例如;从组合框中选择一个IetfLanguageTag值。谢谢回复 – idemirel 2011-04-09 19:19:35

+0

@idemirel,我更新了我的回答 – 2011-04-09 21:20:51

+0

我打算在5分钟内尝试。谢谢 – idemirel 2011-04-10 08:34:58

1

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

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}" />