2010-07-07 14 views
7

Tenemos un sistema de lenguaje dinámico que no usa archivos de recursos convencionales; obteniendo recursos de una base de datos, a través de una biblioteca de administrador de idioma en su lugar. Basado en una solución heredada (VB6), los idiomas se controlan de acuerdo con el nombre del recurso en la propiedad de la etiqueta del control. Después de que la página se haya inicializado, activamos un método que toma LayoutRoot y recursamos que los niños aplican cadenas buscadas desde la etiqueta donde el control tiene una. Esto resulta ser difícil de manejar, la rutina recursiva se ha convertido en un monstruo para atender las sutilezas de los diferentes controles y quiero cambiar a utilizar el enlace de datos para aplicar las cadenas en su lugar.¿Es posible vincular datos a un método en Silverlight?

Me doy cuenta de que podría declarar propiedades para vincular a cada control, pero esto implicará una gran cantidad de código y espero que haya una mejor manera. ¿Hay alguna manera de vincularse a un método, pasando un parámetro? Me imagino un método como este.

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

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

Ya tenemos un método estático en nuestra aplicación para esta recuperación, que tiene la siguiente firma.

public static Resource(string resourceName, string defaultValue) 

Ser capaz de usar eso directamente sería genial.

+2

¿Acabas de usar "language" como verbo? * estremecimiento * –

+0

Lo hice y lo reconozco como un mal uso del idioma. ¿Qué verbo recomendarías? Traducir no parece correcto para lo que estoy describiendo. –

+0

"inicializa", "traduce", "aplica recursos a" –

Respuesta

4

Puede usar un value converter y luego pasarle un parámetro para buscar los recursos. No necesariamente importaría a qué propiedad fue la vinculación ya que su convertidor de valor podría ignorar esa parte y solo usar el ConverterParameter pasado para realizar su búsqueda de recursos.

A continuación, puede crear una instancia de su convertidor de recursos en los recursos de la aplicación y utilizarla en toda su aplicación.

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

Esto funciona bastante bien, gracias. –

+0

@Steve: No hay problema. Tuve que hacer algo similar (aunque no con recursos) y tropecé con este enfoque descarado. :) –

Cuestiones relacionadas