2009-12-21 5 views
5

Je suis dans une situation où certaines valeurs étendues d'application sont stockées en tant que constantes - c'est une exigence car elles sont nécessaires dans les définitions d'attributs (les attributs doivent être résolus au moment de la compilation. travail).Liaison à un champ const dans Silverlight

Je souhaite également pouvoir réutiliser ces valeurs dans des fichiers XAML. Donc, si j'ai mes constantes comme ceci:

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

Je veux un les lier à des contrôles définis dans XAML quelque chose comme ceci:

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

Est-ce possible d'une manière avant droit? J'ai regardé des exemples contraignants, mais je n'arrive pas à trouver ce genre de scénario.

Y aurait-il peut-être une sorte de travail autour que je pouvais faire (peut-être des liaisons traduites en paramètres pour une méthode qui tire dynamiquement le champ constant par réflexion)

Répondre

5

est l'approche Ici, je prendrais: -

à travers le XAML j'utiliser une syntaxe StaticResource comme ceci: -

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

Créer une méthode statique quelque part qui renvoie un ResourceDictionary et prend Type comme paramètre. La fonction utilise la réflexion pour énumérer l'ensemble des constantes publiques qu'elle expose. Il ajoute la valeur de chaîne de chaque constante au ResourceDictionary en formulant le nom de clé à partir du nom Type et du nom Consts.

Au cours du cycle de démarrage de l'application, attribuez la valeur à la collection typeof(MyConstants) dans la propriété MergedDictionaries de la ressource d'application.

Maintenant, toutes les ressources statiques doivent être résolues correctement, il n'est pas nécessaire d'appeler une liaison ou de définir un datacontext pour que cela fonctionne. La valeur est résolue pendant l'analyse XAML.

+0

C'était exactement le genre de solution que je cherchais, merci. – David

+0

@Anthony, pouvez-vous coller le code ici. Je suis un peu confus dans votre description. Merci. –

+0

J'ai également ajouté une solution ici, mais le concepteur visuel ne serait pas reflété, bien que l'effet d'exécution soit correct. –

4

Vous pouvez faire cela, mais seulement si vous mettre en œuvre une propriété cela renvoie la constante. La liaison ne fonctionne que contre les propriétés. Pour faire ce travail, changer votre déclaration:

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

Pour cela Travailler là doit être une instance d'une classe MyConstants disponible dans le DataContext. – AnthonyWJones

+0

Oui. Vous devez avoir quelque chose, quelque part, où vous pouvez obtenir une instance.Vous pouvez implémenter cette propriété directement dans votre classe de contexte de données et extraire la constante à partir de là. –

1

Si vous ne me dérange pas le concepteur visuel, je voudrais juste faire

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

ici:

  1. statique et getter seulement rendent const,
  2. et il est aussi un propriété afin que vous puissiez faire la liaison comme ça.

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

Cependant, comme je l'ai dit, il ne reflète pas le concepteur visuel (XAML) dans Visual Studio, ce qui est assez grand dommage :-)

+0

Est-ce que 'MyConstants' est une classe? La syntaxe que vous avez actuellement ne compilera pas. Comment 'Binding' se rend-il compte que le littéral" MyConstants "sur son chemin fait référence à un type plutôt qu'à une propriété du' DataContext' actuel? Il doit également comprendre que "Constant1" fait référence à la propriété statique sur ce type plutôt qu'à une propriété d'instance. D'après mon expérience, cela ne fonctionne pas. Quelle version de Silverlight utilisez-vous? – AnthonyWJones

Questions connexes