Data binding is an extrememly cool avalon feature that lets you automatically populate UI with data.  Value converters supply a generic way to adapt a model to the view without having to write custom code.  For instance, it is fairly common to set visibility of elements based on whether or not they should be enabled, and you can data bind the visibility of your element to some bool property, and use a BoolToVisibilityConverter to convert the bool to a visibility.

But what if you want a more complex binding - what if you only want to show a listbox when the number of items is greater than zero?  Say you have an IntegerToBoolConverter, and a BoolToVisibilityConverter, but you don't want to write a new IntegerToVisibilityConverter.  If you add a composing converter to your value converter toolbox, you'll have a generic way to chain converters together.

public class ComposingConverter : IValueConverter
{
  private List<IValueConverter> converters = new List<IValueConverter>();
  public List<IValueConverter> Converters
  {
   get { return this.converters; }
  }

  public object Convert(object o, Type targetType, object parameter, CultureInfo culture)
  {
   for (int i = 0; i < this.converters.Count; i++)
   {
    o = converters[i].Convert(o, targetType, parameter, culture);
   }
   return o;
  }

  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  {
   for (int i = this.converters.Count - 1; i >= 0; i--)
   {
    value = converters[i].ConvertBack(value, targetType, parameter, culture);
   }
   return value;
  }
 }
}

Then you would use this converter like so:

<ComposingConverter>
 <ComposingConverter.Converters>
  <IntegerToBoolConverter/>
  <BoolToVisibilityConverter/>
 </ComposingConverter.Converters>
</ComposingConverter>