2010-10-26 18 views
6

Tengo cadenas de formato en mis archivos de recursos. Estoy tratando de acceder a ellas desde el atributo de texto de TextBlock usando FormatStringStringFormat en Silverlight Xaml y recursos

Text="{Binding Path=Project.Name, StringFormat={Binding Path=WkStrings.DisplayProjectName, Source={StaticResource ResourceWrapper}}}" 

estoy consiguiendo el error siguiente:

Provide value on 'System.Windows.Data.Binding' threw an exception 

puntos de error a text =.

¿Es posible acceder a los recursos desde un "enlace anidado"?

Respuesta

8

Binding.StringFormat no es una propiedad de dependencia y, por lo tanto, no puede establecer un enlace a este accesorio erty. Si desea asignar un valor a la propiedad, su valor tiene que ser un recurso estático, como esto:

<TextBlock Text="{Binding ProjectName, StringFormat={StaticResource ProjectNameFormat}}"/> 

Usted debe declarar el recurso de la siguiente manera:

<UserControl.Resources> 
    <System:String x:Key="ProjectNameFormat">Project: {0}</System:String> 
</UserControl.Resources> 

El resultado final es parecido esto:

Resource String Format

+0

Necesito Mantenga los especificadores de formato en una ubicación que los haga accesibles desde toda la aplicación y * "localizable" *. ¿Cómo voy a lograr esto? La única solución que puedo pensar en este momento es una envoltura alrededor de los administradores de recursos (algo así como un localizador) que creo que es un poco exagerado. – Nasser

+0

Con lo que terminamos fue haciendo que estuvieran disponibles a través del sistema ViewModel. Tenemos un agregador para este tipo de formateadores como propiedad del modelo de vista base para el proyecto, por lo que los usuarios de Blend tienen todos ellos disponibles de manera correcta, o cada vista, ya que todos los modelos de vista se derivan de esta base. Cuando se agregan nuevos formateadores a la biblioteca de cadenas, se agrega una propiedad de envoltura a la clase del agregador y eso la hace disponible para toda la aplicación.Es un poco exagerado, pero funciona. – Murven

1

Su sintaxis es incorrecta para usar StringFormat y es posible que desee algo distinto de StringFormat. StringFormat se usa para manipular la salida de lo que está asignado a la ruta de enlace. En su ejemplo, está vinculando a la propiedad Project.Name.

StringFormat se debe utilizar para lograr el efecto similar al utilizar String.Format en el código. Ver esta referencia para el formato: http://msdn.microsoft.com/en-us/library/26etazsy(v=VS.95).aspx

Otras respuestas en torno a este tema:

Does Silverlight support StringFormat in binding?

http://blog.davemdavis.net/2009/12/03/silverlight-4-data-binding-string-format/

Aquí hay un código de ejemplo de la utilización de StringFormat:

<TextBlock Text="{Binding Path=Cost, StringFormat=\{0:c\}}" /> 
+0

El contenido de ruta de enlace = WkStrings.DisplayProjectName, Fuente = {}} StaticResource ResourceWrapper es en realidad un especificador de formato (algo así como "Proyecto: {0} "). Lo que es extraño es que puedo leer la cadena del archivo resx, pero no usar su contenido como especificador de formato para la función FormatString. ¿Dónde más puedo guardar mis especificadores de formato (mientras los tengo disponibles globalmente)? – Nasser

+0

Ah, veo lo que estás tratando de hacer ahora. No estoy seguro de que sea compatible. En este momento, probablemente sugeriría exponer el texto formateado como una propiedad de un ViewModel. O utilizando un enlace múltiple y un convertidor para unir los dos. Ver esta publicación: http://www.scottlogic.co.uk/blog/colin/2009/06/silverlight-multibindings-how-to-attached-mutiple-bindings-to-a-single-property/ –

Cuestiones relacionadas