>

tisdag 14 juni 2016

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

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.

Inga kommentarer:

Skicka en kommentar