[英]xaml Binding to nested property of singleton
我有Singleton
班
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}"
設置我的Text屬性將調用我的ProvideValue(IServiceProvider serviceProvider)
方法,因此我將綁定到MyText的resource.string上。
現在,我有了多種語言,我正在嘗試使用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中做到這一點。
因此,要解決我的問題,我不得不重構很多代碼。
當初始化該組件的視圖中創建一個新的Translator
每一次,我希望這個Translator
來考慮CultureInfo
選擇,所以我創建了一個新的Singleton
GlobalCulture
,而不是讓我CultureInfo Ci
從我的Translator
,我把它直接從我的GlobalCulture
。 這樣,無論我使用GlobalTranslator
還是由View InitializeComponent
的新Translator
都沒關系,我將始終獲得正確的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);
因此,我可以通過Content="{Core:Translator Text=MyText}"
在XAML中設置文本
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.