pondělí 23. září 2013

Jednodušší práce s convertery v XAMLu

Při psaní XAMLu je občas otravné definovat použité convertery v resources a odkazovat se na ně. Může se hodit následující bázový converter, od kterého oddědíte nově vytvářený:


[MarkupExtensionReturnType(typeof(IValueConverter))]
public abstract class BaseValueConverter<TValueConverter> : MarkupExtension, IValueConverter 
    where TValueConverter : IValueConverter, new()
{
    public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture);
    public abstract object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);
    
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return new TValueConverter();
    }
}
    
[MarkupExtensionReturnType(typeof(IMultiValueConverter))]
public abstract class BaseMultiValueConverter<TValueConverter> : MarkupExtension, IMultiValueConverter
    where TValueConverter : IMultiValueConverter, new()
{
    public abstract object Convert(object[] values, Type targetType, object parameter, CultureInfo culture);
    public abstract object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture);
    
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return new TValueConverter();
    }
}

Následně díky odděděné MarkupExtension můžete přímo odkazovat na nově vytvářenou instanci svého converteru v XAMLu takto:


<TextBox Text="{Binding Path=Value, Converter={conv:MyCustomConverter}" />

Při každém vyhodnocení bindingu se provolá metoda ProvideValue(...), která vrací novou instanci converteru.

Žádné komentáře:

Okomentovat