2011-04-09 128 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}" />