【问题标题】:How to switch UI Culture of data binding on the fly in Silverlight如何在 Silverlight 中动态切换数据绑定的 UI 文化
【发布时间】:2010-10-21 21:14:55
【问题描述】:

我有一个 TextBlock 控件,它是绑定到 DateTime 属性的数据。

文本显示如下:

2010 年 10 月 21 日,星期四

我需要即时切换 UI 文化,使用如下方式:

Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture 
                                    = new CultureInfo("de-de");

我试过这个来强制绑定重新计算:

var bindingExpression = textBlock.GetBindingExpression(TextBlock.TextProperty);
bindingExpression.UpdateSource();

但我仍然看到星期四而不是 Donnerstag...

我该如何进行?有什么想法吗?

【问题讨论】:

    标签: silverlight data-binding silverlight-4.0 localization


    【解决方案1】:

    我找到了一种更好的方法,它只需要更新根视觉。

    public sealed class Localizer : INotifyPropertyChanged
    {
      public Localizer() 
      {
        Culture = Thread.CurrentThread.CurrentCulture; 
      }
    
      XmlLanguage _language;
      public XmlLanguage Language 
      { 
        get { return _language; } 
        private set { _language = value; RaiseOnPropertyChanged("Language"); } 
      }
    
      CultureInfo _culture;
      public CultureInfo Culture 
      { 
        get { return _culture; }
        set 
        { 
          Contract.Requires(value != null);  
    
          if (_culture == value) return; 
          _culture = value; 
    
          Thread.CurrentThread.CurrentCulture =
          Thread.CurrentThread.CurrentUICulture = value;
          Language = XmlLanguage.GetLanguage(value.Name);
    
          RaiseOnPropertyChanged("Culture");
        }
      }
    
      protected void RaiseOnPropertyChanged(string propName) 
      {
        var e = OnPropertyChanged;
        if (e != null) e(this, new PropertyChangedEventArgs(propName));
      }
    
      public event PropertyChangedEventHandler OnPropertyChanged;
    }

    现在将此实例添加到应用程序资源:

    <nt:Localizer x:Key="Localizer"/>
    

    现在将它绑定到您的根视觉对象(例如 Frame、UserControl 或 Page),如下所示:

    <UserControl ... Language="{Binding Language, Source={StaticResource Localizer}}">
    

    【讨论】:

      【解决方案2】:

      您可以使用以下转换器:

      public class StringFormatter : IValueConverter
      {
      
          public String Format { get; set; }
          public String Culture { get; set; }
      
      
          #region IValueConverter Members
      
          public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
          {
              if (!String.IsNullOrEmpty(Culture))
              {
                  culture = new System.Globalization.CultureInfo(Culture);
              }
              else
              {
                  culture = System.Threading.Thread.CurrentThread.CurrentUICulture;
              }
              if (value == null) { return value; }
              if (String.IsNullOrEmpty(Format)) { return value; }
              return String.Format(culture, Format, value).Trim();
          }
      
          public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
          {
              throw new NotImplementedException();
          }
      
          #endregion
      }
      

      然后您可以设置 CurrentUICulture 并强制更改绑定,转换器将使用新的文化。

      如果您想以长格式显示日期,请在 XAML 中声明转换器,如下所示:

      <local:StringFormatter x:Key="LongDateFormatter" Format=" {0:D}" />
      

      然后像这样在你的 TextBlock 中使用它:

      <TextBlock x:Name="DateText" Text="{Binding DateTime.Date, Converter={StaticResource LongDateFormatter}, Mode=OneWay}"/>
      

      在代码中,您可以执行以下操作来强制更改绑定:

      Thread.CurrentThread.CurrentUICulture = new CultureInfo(desiredCultureString);
      var tempDateTime = this.DateTime;
      this.DateTime = default(DateTime);
      this.DateTime = tempDateTime;
      

      当然还有其他方法可以强制改变,可能你也需要改变其他领域以适应新的文化,但这是如何处理它的一般思路。

      【讨论】:

      • 如果您有一个必须本地化的控件,则此方法有效。想象一下,您必须更新所有 XAML 文件中的所有绑定表达式...
      • 是的,这种方法不可扩展。您在答案中描述的绝对更适合完全本地化。顺便说一句,如果您正在本地化应用程序,您可能想看看这个:wpflocalizeaddin.codeplex.com
      • 感谢您的链接。不幸的是,它不适用于 Silverlight。
      • 您可以选择 3 种支持的 XAML 本地化方法中的任何一种: LocText Xaml 扩展 wpflocalizeextension.codeplex.com; x:对资源代码生成类的静态引用,例如描述这里;绑定到资源包装器,在 MSDN 站点上作为 Silverlight 的示例进行了描述(也可用于常规 WPF)。 (这是唯一与 Silverlight 兼容的。)[所以它说它的 3D 选项与 SILVERLIGHT 兼容]
      • 也从上面的 URL,我发现 github.com/SeriousM/WPFLocalizationExtension 这似乎说它也适用于 Silverlight
      猜你喜欢
      • 2010-10-20
      • 1970-01-01
      • 2011-05-07
      • 2011-04-13
      • 1970-01-01
      • 2014-10-17
      • 2011-08-29
      • 2010-09-26
      • 1970-01-01
      相关资源
      最近更新 更多