2009-12-21 12 views
5

Ich habe eine Situation, in der einige anwendungsweite Werte als Konstanten gespeichert werden - dies ist eine Voraussetzung, wie sie in Attributdefinitionen benötigt werden (Attribute müssen zur Kompilierungszeit auflösen, so auch statische Mitglieder nicht) Arbeit).Bindung an ein const-Feld in Silverlight

Ich möchte auch in der Lage sein, diese Werte auch in XAML-Dateien wiederzuverwenden. Also, wenn ich diese meine Konstanten wie haben:

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

ich auf eine Art und Weise wollen sie binden zu Kontrollen definiert in XAML etwas wie folgt aus:

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

Ist das möglich in einem geradlinig Weise? Ich habe über verbindliche Beispiele nachgedacht, aber ich kann kein solches Szenario finden.

Gäbe es vielleicht irgendeine Art von Arbeit sein um I (vielleicht Bindungen in den Parameter für eine Methode übersetzt, die dynamisch den konstanten Bereich über Reflexion zieht) tun könnte

Antwort

5

Hier ist der Ansatz, den ich nehmen würde: -

Durch aus dem XAML würde ich eine Static Syntax wie folgt verwendet werden: -

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

Erstellen Sie irgendwo eine statische Methode, die ResourceDictionary zurückgibt und Type als Parameter verwendet. Die Funktion verwendet Reflektion, um die Menge öffentlicher Konstanten aufzulisten, die sie verfügbar macht. Es fügt den Zeichenfolgenwert jeder Konstante zu dem ResourceDictionary hinzu, das den Schlüsselname aus dem Type-Namen und dem Name des Konflikts formuliert.

Während des Starts der Anwendung übergeben Sie typeof(MyConstants) an diese Funktion, und fügen Sie die zurückgegebene ResourceDictionaries der Auflistung in der Application Resources MergedDictionaries-Eigenschaft hinzu.

Jetzt sollten alle statischen Ressourcen korrekt aufgelöst werden, es ist nicht nötig, irgendeine Bindung aufzurufen oder einen Datenkontext zu setzen, um dies zum Laufen zu bringen. Der Wert wird während der XAML-Analyse aufgelöst. Hier

+0

Das war genau die Art von Lösung, nach der ich gesucht habe, danke. – David

+0

@Anthony, können Sie den Code hier einfügen. Ich bin irgendwie verwirrt in deiner Beschreibung. Vielen Dank. –

+0

Ich habe hier auch eine Lösung hinzugefügt, aber der Visual Designer wird nicht angezeigt, obwohl der Laufzeiteffekt korrekt ist. –

4

Sie dies tun können, aber nur, wenn Sie eine Eigenschaft implementieren das gibt die Konstante zurück. Bindung funktioniert nur gegen Eigenschaften. Um diese Arbeit zu machen, ändern Sie Ihre Erklärung:

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

Damit diese ziemlich großes Mitleid ist zu Dort muss eine Instanz einer MyConstants-Klasse im DataContext verfügbar sein. – AnthonyWJones

+0

Ja. Du musst irgendwo etwas haben, wo du eine Instanz bekommen kannst.Sie könnten diese Eigenschaft direkt in Ihrer Datenkontextklasse implementieren und die Konstante auch von dort abrufen. –

1

Wenn Sie nicht den Visual Designer nichts dagegen tun, würde ich tun, nur

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

:

  1. statische und Getter-only machen const,
  2. und es ist auch ein Eigenschaft, so dass Sie so binden können.

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

aber wie gesagt, es wird nicht auf dem Visual Designer (XAML) in Visual Studio reflektiert, die :-)

+0

Ist 'MyConstants' eine Klasse? Die Syntax, die Sie hier haben, wird derzeit nicht kompiliert. Wie erkennt die "Bindung", dass das Literal "MyConstants" in seinem Pfad tatsächlich auf einen Typ und nicht auf eine Eigenschaft des aktuellen "DataContext" verweist? Es muss auch verstanden werden, dass "Constant1" auf eine statische Eigenschaft dieses Typs und nicht auf eine Instanzeigenschaft verweist. Nach meiner Erfahrung funktioniert das nicht. Welche Version von Silverlight verwenden Sie? – AnthonyWJones