簡體   English   中英

xaml綁定到單例的嵌套屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM