xaml绑定到singleton的嵌套属性

时间:2016-09-15 08:38:53

标签: c# xaml binding 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中进行。

1 个答案:

答案 0 :(得分:0)

所以为了解决我的问题,我不得不重构一些代码。

在初始化组件时,每次视图创建一个新的Translator,我希望此Translator考虑所选的CultureInfo,因此我创建了一个新的Singleton GlobalCulture,而不是从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);

我这样做:
Content="{Core:Translator Text=MyText}"

所以我可以通过six

在XAML中设置我的文本