2009-12-21 26 views
5

我有一種情況,其中一些應用程序範圍的值存儲爲常量 - 這是一個需求,因爲它們在屬性定義中是必需的(屬性必須在編譯時解析,所以即使靜態成員也不工作)。在Silverlight中綁定到const字段

我希望也能夠在XAML文件中重用這些值。所以,如果我有我的常數是這樣的:

public class MyConstants 
{ 
    public const string Constant1 = "Hello World"; 
} 

我想將它們綁定一個辦法在XAML東西像這樣定義的控件:

<TextBlock Text="{Binding MyConstants.Constant1}" /> 

這是可能以直接的方式?我已經看過綁定的例子,但似乎無法找到這種情況。

請問有可能是某種工作圍繞我可以做(也許綁定翻譯成參數是通過反射動態拉定場的方法)

回答

5

這裏是我採取的方法: -

通過了XAML我會用一個靜態資源的語法如下: -

<TextBlock Text="{StaticResource MyConstants_Constant1}" /> 

創建一個靜態方法,返回ResourceDictionary並將Type作爲參數。該函數使用反射來枚舉它公開的一組公共常量。它將每個常量的字符串值添加到ResourceDictionary,以表示類型名稱和Consts名稱中的鍵名稱。

在應用程序啓動過程中,通過typeof(MyConstants)將此函數添加到應用程序資源MergedDictionaries屬性中的集合中返回ResourceDictionaries

現在所有的靜態資源都應該正確解析,不需要調用任何綁定或設置任何datacontext爲了得到這個工作。該值在XAML分析過程中解析。

+0

這正是我尋找的解決方案,謝謝。 – David

+0

@Anthony,你可以在這裏粘貼代碼。我對你的描述感到困惑。謝謝。 –

+0

我也在這裏添加了一個解決方案,但可視化設計器不會被反映出來,儘管運行時效果是正確的。 –

4

你可以做到這一點,但只有當你實現一個屬性返回常量。綁定僅適用於屬性。爲了使這項工作,你的宣言更改爲:

public class MyConstants 
{ 
    private const string constant1 = "Hello World"; 
    public string Constant1 { get { return constant1; } } 
} 
+0

爲了這反映在那裏工作需要有一個DataContext中可用的MyConstants類的實例。 – AnthonyWJones

+0

是的。你必須有一些東西,在某個地方,你可以得到一個實例。你可以直接在你的數據上下文類中實現這個屬性,並從那裏取出常量。 –

1

如果你不介意的可視化設計,我只想做

public MyConstants 
{ 
    public static string Constant1 { get { return "Hello World"; } } 
} 

這裏:

  1. 靜態和消氣只能使常量,
  2. ,它也是一個財產,這樣你可以做這樣的綁定。

    <TextBlock Text="{Binding MyConstants.Constant1}" />

然而,正如我所說,它不會在Visual Studio中的可視化設計器(XAML),這是相當大的憐憫:-)

+0

MyConstants是一個類嗎?您目前在這裏的語法不會編譯。 'Binding'如何認識到其路徑中的文字「MyConstants」實際上是指一種類型而不是當前'DataContext'的屬性?它還需要了解「Constant1」是指此類型的靜態屬性,而不是實例屬性。根據我的經驗,這是行不通的。你使用的是什麼版本的Silverlight? – AnthonyWJones