2016-09-15 87 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}"