xaml 绑定到单例的嵌套 属性
xaml Binding to nested property of singleton
我有一个Singleton
Class
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
Class
定义一种文化
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);
}
}
在我只使用我的翻译器 Class 之前,我可以这样绑定 :
Content="{Core:Translator Text=MyText}"
设置我的文本 属性 将调用我的 ProvideValue(IServiceProvider serviceProvider)
方法,因此我将绑定到我的 resource.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 中是否有办法做到这一点。
因此,为了解决我的问题,我不得不重构相当多的代码。
初始化组件时,View 每次都创建一个新的 Translator
,我希望这个 Translator
考虑到 CultureInfo
的选择,所以我创建了一个新的 [=14] =] GlobalCulture
,而不是从我的 Translator
中获取我的 CultureInfo Ci
,我直接从我的 GlobalCulture
中获取它。
这样,无论我使用我的 GlobalTranslator
还是由我的视图 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 中设置我的文本
我有一个Singleton
Class
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
Class
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);
}
}
在我只使用我的翻译器 Class 之前,我可以这样绑定 :
Content="{Core:Translator Text=MyText}"
设置我的文本 属性 将调用我的 ProvideValue(IServiceProvider serviceProvider)
方法,因此我将绑定到我的 resource.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 中是否有办法做到这一点。
因此,为了解决我的问题,我不得不重构相当多的代码。
初始化组件时,View 每次都创建一个新的 Translator
,我希望这个 Translator
考虑到 CultureInfo
的选择,所以我创建了一个新的 [=14] =] GlobalCulture
,而不是从我的 Translator
中获取我的 CultureInfo Ci
,我直接从我的 GlobalCulture
中获取它。
这样,无论我使用我的 GlobalTranslator
还是由我的视图 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}"