Blogginlägg

Lättare syntax för Converters i WPF/XAML

Av Cecilia Wirén | Blogg | 14 juni 2016

När du skriver din xaml kod och inser att du behöver en converter till ditt vymodellsvärde är det några steg som behöver göras:
- Om du inte redan har en converter för mappningen, gå och skapa den.
- importera namespacet i xaml koden.
- skapa en instance av convertern i vald Resource collection.
- gör din binding med converten.
Med en singelton Converter kan du förenkla detta något. Lägg till följande klass till ditt xaml projekt:
public abstract class ValueConverter<T> : IValueConverter
where T : new()
{
private static T _instance;
public static T Instance
{
get
{
if (_instance == null)
_instance = new T();
return _instance;
}
}

public abstract object Convert(object value,
Type targetType, object param, CultureInfo cu);

public virtual object ConvertBack(object value,
Type targetType, object param, CultureInfo cu)
{
throw new NotImplementedException();
}
}
När du sedan behöver en converter (eller vill uppgradera din befintliga converters) ärver du från ovanstående generiska basklass likt nedan:
public class BooleanToColorConverter : 
ValueConverter<BooleanToColorConverter >
{
public override object Convert(object value,
Type targetType, object param, CultureInfo cu)
{
var booleanValue = value as Boolean?;
if (booleanValue.HasValue)
{
return booleanValue.Value ?
Colors.Green : Colors.Red;
}
return Colors.Red;
}

public override object ConvertBack(object value,
Type targetType, object param, CultureInfo cu)
{
//only write this if you need it
}
}
När du sedan ska använda den använder du x:Static syntaxen enligt nedan:
 <StackPanel Background="{Binding Valid, 
Converter={x:Static local:BooleanToColorConverter.Instance}}">
<StackPanel>
alternativt:
<StackPanel Background="">
<Binding
converter="{x:Static local:BooleanToColorConverter.Instance}"/>
</StackPanel>
</StackPanel>
Teorin går även att applicera på multiconverters.
Till inlägget