2016-09-15 3 views
0

У меня есть Singleton классаXAML Связывание с вложенным свойством одноплодных

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 ould вызовите мой метод ProvideValue(IServiceProvider serviceProvider), и поэтому я бы привязывался к моему ресурсу.string из MyText.

Теперь, когда у меня есть несколько языков, я пытаюсь сделать то же самое, используя мой GlobalTranslator. я мог бы добавить ссылку на мои GlobalTranslator.Instance делая

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

, но я не могу найти способ сделать что-то вроде

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

я все еще могу это сделать в коде позади

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

Но хотелось бы знать, есть ли способ сделать это в xaml.

ответ

0

Так что, чтобы исправить мою проблему, мне пришлось реорганизовать совсем немного кода.

При инициализации компонента The View Создать новую Translator каждый раз, когда я хотел, чтобы этот Translator принять во внимание CultureInfo Selected, поэтому я создал новый SingletonGlobalCulture, и вместо того, чтобы получать мои CultureInfo Ci от моего Translator, я понимаю, прямо от моего 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}"

Смежные вопросы