2010-07-07 101 views
7

我們有一個不使用傳統資源文件的動態語言系統;而是通過語言管理器庫從數據庫獲取資源。基於傳統(VB6)解決方案,它的語言根據控件的標籤屬性中的資源名稱進行控制。在頁面初始化之後,我們引發一個採用LayoutRoot的方法,並遞歸它的子應用字符串的控件從標籤中查找字符串。這被證明是笨拙的,遞歸例程變成了怪物來迎合不同控件的微妙之處,我想改爲使用數據綁定來應用字符串。是否有可能將數據綁定到Silverlight中的方法?

我意識到我可以聲明屬性來綁定到每個控件,但這會涉及很多代碼,我希望有更好的方法。有沒有辦法綁定到一個方法,傳遞一個參數。我設想了一個像這樣的方法。

public string GetResource(string resourceName) 
{ 
    string resource = <fetch resource from language manager>; 

    if (String.IsNullOrEmpty(resource)) 
    { 
    return resourceName; 
    } 
    else 
    { 
    return resource; 
    } 
} 

我們在我們的應用程序中已經有一個靜態方法用於檢索,它有以下簽名。

public static Resource(string resourceName, string defaultValue) 

爲了能夠直接使用,會很好。

+2

您剛剛使用「語言」作爲動詞嗎? *不寒而慄* – 2010-07-07 13:44:48

+0

我做了,我認識到它是對語言的濫用。你會推薦什麼動詞?翻譯似乎不適合我描述的內容。 – 2010-07-07 14:55:55

+0

「初始化」,「翻譯」,「應用資源」 – 2010-07-07 15:02:58

回答

4

您可以使用value converter,然後傳遞一個參數來查找資源。因爲你的值轉換器可以忽略這個部分並且只是使用通過的ConverterParameter來執行你的資源查找,所以綁定的屬性並不一定重要。

然後,您可以在App資源中創建資源轉換器的實例,並在整個應用程序中使用它。

... SomeProperty="{Binding Converter={StaticResource MyAppResourceConverter}, 
          ConverterParameter=SomePropertyResourceName}}" ... 
+1

這很好,謝謝。 – 2010-07-07 14:59:20

+0

@Steve:沒問題。我不得不做類似的事情(雖然不是資源),並且偶然發現了這種厚顏無恥的做法。 :) – 2010-07-07 15:02:08