2016-09-15 70 views
0

嵌套属性我有一个SingletonXAML绑定到的单

public sealed class GlobalTranslator 
    { 
     public Translator Translator = new Translator(); 

     static readonly GlobalTranslator INSTANCE = new GlobalTranslator(); 

     private GlobalTranslator() 
     { 

     } 

     public static GlobalTranslator Instance 
     { 
      get 
      { 
       return INSTANCE; 
      } 
     } 
    } 

,让我来定义文化为我Translator

public class Translator : MarkupExtension 
{ 
    readonly CultureInfo Ci; 
    const string ResourceId = "LDVELH_WPF.Resources.Strings"; 

    public Translator() 
    { 
     Ci = Thread.CurrentThread.CurrentCulture; 
    } 
    public Translator(String language) 
    { 
     switch (language.ToLower()) 
     { 
      case "french": 
       Ci = new CultureInfo("fr-FR"); 
       break; 
      case "english": 
       Ci = new CultureInfo("en-GB"); 
       break; 
      default: 
       Ci = new CultureInfo("en-GB"); 
       break; 
     } 
    } 
    public Translator(SupportedLanguage language) 
    { 
     switch (language) 
     { 
      case SupportedLanguage.French: 
       Ci = new CultureInfo("fr-FR"); 
       break; 
      case SupportedLanguage.English: 
       Ci = new CultureInfo("en-GB"); 
       break; 
      default: 
       Ci = new CultureInfo("en-GB"); 
       break; 
     } 
    } 

    public string Text 
    { 
     get; 
     set; 
    } 

    override public object ProvideValue(IServiceProvider serviceProvider) 
    { 
     if (Text == null) 
      return ""; 

     ResourceManager Resmgr = new ResourceManager(ResourceId 
          , typeof(Translator).GetTypeInfo().Assembly); 

     return Resmgr.GetString(Text, Ci); 
    } 
    public string ProvideValue(string stringToTranslate) 
    { 
      Text = stringToTranslate; 
      if (Text == null) 
       return ""; 

      ResourceManager Resmgr = new ResourceManager(ResourceId 
           , typeof(Translator).GetTypeInfo().Assembly); 

      return Resmgr.GetString(Text, Ci); 
    } 
} 

我以前的时候只用我的翻译类,我可以这样绑定:

Content="{Core:Translator Text=MyText}" 

设置我的文本属性w应该打电话给我的ProvideValue(IServiceProvider serviceProvider)方法,所以我会绑定我MyText的resource.string。

既然我有多种语言,我正在尝试使用我的GlobalTranslator来做同样的事情。 我可以做

<Window.Resources> 
     <x:StaticExtension Member="Core:GlobalTranslator.Instance" x:Key="MyGlobalTranslator"/> 
</Window.Resources> 

的引用添加到我的GlobalTranslator.Instance,但我似乎无法找到一种方法做一些像

Content="{MyGlobalTranslator.Translator Text=MyText}" 

我还是能做到这一点在后面的代码由

MyButton.Content = GlobalTranslator.Instance.Translator.ProvideValue("MyText"); 

但想知道是否有办法在xaml中做到这一点。

回答

0

所以要解决我的问题,我不得不重构相当多的代码。

当初始化该组件的视图中创建一个新的Translator每一次,我想这Translator考虑到了CultureInfo选择,所以我创建了一个新的SingletonGlobalCulture,而是从我的Translator让我CultureInfo Ci,我把它直接从我的GlobalCulture。 这种方式没关系,如果我用我的GlobalTranslator或新的Translator工作我的视图InitializeComponent初始化,我将永远得到正确的CultureInfo

Translator现在看起来像这样:

public class Translator : MarkupExtension 
{ 
const string ResourceId = "LDVELH_WPF.Resources.Strings"; 

public Translator() 
{ 
} 

public string Text 
{ 
    get; 
    set; 
} 

override public object ProvideValue(IServiceProvider serviceProvider) 
{ 
    if (Text == null) 
     return ""; 

    ResourceManager Resmgr = new ResourceManager(ResourceId 
         , typeof(Translator).GetTypeInfo().Assembly); 

    return Resmgr.GetString(Text, GlobalCulture.Instance.Ci); 
} 
public string ProvideValue(string stringToTranslate) 
{ 
     Text = stringToTranslate; 
     if (Text == null) 
      return ""; 

     ResourceManager Resmgr = new ResourceManager(ResourceId 
          , typeof(Translator).GetTypeInfo().Assembly); 

     return Resmgr.GetString(Text, GlobalCulture.Instance.Ci); 
} 
} 

当我改变了我的语言设置,而不是这样做的:GlobalTranslator.Instance.Translator = new Translator(language);

我做的:
GlobalCulture.Instance.CultureInfo = new CultureInfo(language);

所以我可以在XAML中设置我的文本通过Content="{Core:Translator Text=MyText}"