Encuadernación en Silverlight requiere un objeto Fuente o un objeto Dependencia. Desde ese objeto de origen puede vincularse a Propiedades (por lo tanto, por definición, está vinculando a miembros de instancia) o Propiedades de Dependencia.
Dado que DateTime.Now
es una propiedad estática, no se puede enlazar directamente en Silverlight, por lo tanto, se necesita un código. La segunda mejor opción es utilizar código para: -
- garantizar que gran parte de lo que necesita puede ser expresado en XAML
- para hacerlo de una manera tan disociado de lo posible.
Por lo tanto, podemos analizar que necesitamos dos cosas.
- Exponer los miembros estáticos de DateTime como propiedades de la instancia de un objeto
- tener alguna forma para formatear la DateTime a una salida deseable.
para manejar el primer punto me gustaría crear una clase StaticSurrogate
, donde me gustaría crear propiedades de instancia para las propiedades estáticas que tenemos acceso a: -
public class StaticSurrogate
{
public DateTime Today { get { return DateTime.Today; } }
public DateTime Now { get { return DateTime.Now; } }
}
Ahora necesitamos una manera de formatear una Fecha y hora. Un convertidor de valores es la herramienta adecuada para este trabajo, préstamos en gran medida de esta Tim Heuer Blog: -
public class FormatConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (parameter != null)
{
string formatterString = parameter.ToString();
if (!String.IsNullOrEmpty(formatterString))
{
return String.Format(culture, String.Format("{{0:{0}}}", formatterString), value);
}
}
return (value ?? "").ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Con estas dos clases en el lugar que ahora podemos hacer el resto en XAML, primero necesitamos instancias de estas clases en nuestros recursos : -
<UserControl.Resources>
<local:StaticSurrogate x:Key="Static" />
<local:FormatConverter x:Key="Formatter" />
</UserControl.Resources>
Ahora podemos cablear el TextBlock
: - Nota
<TextBlock Text="{Binding Today, Source={StaticResource Static},
Converter={StaticResource Formatter}, ConverterParameter='dd MMM yyy'}" />
que este enfoque tiene las siguientes ventajas: -
- no es necesario que agreguemos código al UserControl en el que se coloca TextBlock, ni tenemos que jugar con ningún contexto de datos.
- Los recursos estáticos podrían colocarse en la aplicación. Recursos que harían que la creación de TextBlock fuera completamente independiente de tener que agregar algo más al UserControl.
- El formato utilizado para mostrar la fecha se puede modificar independientemente.
- El acceso a propiedades estáticas adicionales se puede agregar fácilmente a la clase
StaticSurrogate
.
que tenga sentido para mí, pero sí parece extrema en comparación con la sintaxis Flex: text = "{new Date()}". Supongo que todo esto se reduce al hecho de que Silverlight solo admite algunas extensiones de marcado dentro de XAML. Sin embargo, estaría bien si hicieran más robustas las evaluaciones de corsé. ¡Gracias por tu ayuda! –