xaml 绑定到单例的嵌套 属性

xaml Binding to nested property of singleton

我有一个SingletonClass

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 中设置我的文本