2009-12-21 13 views
5

Tengo una situación donde algunos valores de aplicación se almacenan como constantes; este es un requisito ya que se necesitan en definiciones de atributos (los atributos deben resolverse en tiempo de compilación, por lo que incluso los miembros estáticos no trabajo).Enlazado a un campo const en Silverlight

También deseo ser capaz de reutilizar estos valores en archivos XAML. Así que si tengo mis constantes de la siguiente manera:

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

quiero una manera atarlos a los controles definidos en XAML algo como esto:

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

Es esto posible de una manera recta hacia adelante? He visto ejemplos vinculantes pero no puedo encontrar este tipo de escenario.

Habría tal vez sea algún tipo de trabajo en todo lo que podía hacer (tal vez fijaciones traducidos a los parámetros de un método que tira dinámicamente el campo constante a través de la reflexión)

Respuesta

5

Aquí es el enfoque me gustaría tener: -

A lo largo del XAML me gustaría utilizar una sintaxis StaticResource así: -

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

Cree un método estático en alguna parte que devuelva ResourceDictionary y tome Type como parámetro. La función usa la reflexión para enumerar el conjunto de constantes públicas que expone. Agrega el valor de cadena de cada constante al ResourceDictionary formulando el nombre de la clave del nombre de Tipo y el nombre de Consts.

Durante el inicio de la aplicación pase typeof(MyConstants) a esta función, agregue ResourceDictionaries a la colección en la propiedad Recursos de la aplicación MergedDictionaries.

Ahora todos los recursos estáticos deberían resolverse correctamente, no hay necesidad de invocar ningún enlace o establecer ningún contexto de datos para que esto funcione. El valor se resuelve durante el análisis XAML.

+0

Este fue exactamente el tipo de solución que estaba buscando, gracias. – David

+0

@Anthony, puedes pegar el código aquí. Estoy un poco confundido en tu descripción. Gracias. –

+0

También agregué una solución aquí, pero el Diseñador visual no se reflejaría, aunque el efecto de tiempo de ejecución es correcto. –

4

usted puede hacer esto, pero sólo si se implementa una propiedad eso devuelve la constante. La vinculación solo funciona en contra de las propiedades. Para realizar este trabajo, cambiar su declaración a:

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

Con el fin de que esto Es necesario que haya una instancia de una clase MyConstants disponible en DataContext. – AnthonyWJones

+0

Sí. Tienes que tener algo, en alguna parte, donde puedas obtener una instancia.Puede implementar esta propiedad directamente en su clase de contexto de datos y también extraer la constante de allí. –

1

Si no te importa el diseñador visual, sólo haría

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

aquí:

  1. estático y captador de sólo hacen que sea constante,
  2. y también es una propiedad para que pueda hacer vinculante como esta.

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

Sin embargo, como ya he dicho, no va a reflexionar sobre el diseñador visual (XAML) en Visual Studio, que es bastante grande pena :-)

+0

¿Es 'MyConstants' una clase? La sintaxis que tienes aquí actualmente no se compilará. ¿Cómo se da cuenta el 'Binding' de que el literal" MyConstants "en su camino en realidad se refiere a un tipo en lugar de una propiedad del actual' DataContext'? También necesitaría entender que "Constante1" se refiere a la propiedad estática en este tipo en lugar de una propiedad de instancia. En mi experiencia, esto no funciona. ¿Qué versión de Silverlight estás usando? – AnthonyWJones

Cuestiones relacionadas