En un control XAML complejo, solemos encontrarnos con el problema de tener que crear gran cantidad de Converters para enlazar correctamente propiedades de controles gráficos con propiedades del ViewModel asociado. Para ello debemos crear, además de la clase Converter correspondiente(código C#), un Recurso en el control XAML y referenciarnos a él en el Binding donde queramos usarlo. Ejemplo:
XAML:
<UserControl.Resources >
<Resources:NombreConverter x:Key="NombreConverter"/>
</UserControl.Resources >
…
{Binding Path=Propiedad, Converter={StaticResource NombreConverter}}
Esta forma de asignar el Converter puede resultar tediosa cuando tenemos gran cantidad de ellos. Para solucionarlo, podemos hacer que la clase Converter que creamos, extienda de MarkupExtension. De esta forma, podremos referenciarnos a él directamente, de la forma:
XAML:
{Binding Path=Propiedad, Converter={Converters:NombreConverter}}
Otra mejora para determinados Converters es la posibilidad de pasarle parámetros. Aunque al Converter se le puede asignar un ConverterParameter, a veces es necesario pasar varios parámetros, y/o nos interesa que estos parámetros tengan nombre y tipo. Para ello, podemos crear en la clase Converter las propiedades que necesitemos y, si queremos, asignarles valores por defecto en un constructor. Ejemplo:
Código:
public class NombreConverter : MarkupExtension, IValueConverter
{
public NombreConverter()
{
Propiedad= valor;
}
public valor Propiedad { get; set; }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
//Lógica de conversión (Puede accederse a Propiedad)
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public override object ProvideValue(IServiceProvider serviceProvider)
{
return this;
}
}
XAML:
Converter={Converters:NombreConverter Propiedad=valor}