Search code examples
c#wpfxamlgenericsivalueconverter

Generic IValueConverter C# WPF usage in XAML?


basically I used the posted Converter here and just changed the Datatype to be a generic. How do I use the generic Converter inside XAML?

public class ReverseListConverter<T> : MarkupExtension, IValueConverter
{
    public ReverseListConverter()
    {
    }

    private ObservableCollection<T> _reversedList;

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        _reversedList = new ObservableCollection<T>();

        var data = (ObservableCollection<T>)value;

        for (var i = data.Count - 1; i >= 0; i--)
            _reversedList.Add(data[i]);

        data.CollectionChanged += DataCollectionChanged;

        return _reversedList;
    }

    void DataCollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        var data = (ObservableCollection<T>)sender;

        _reversedList.Clear();
        for (var i = data.Count - 1; i >= 0; i--)
            _reversedList.Add(data[i]);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Before the Converter was generic I just used

ItemsSource="{Binding Mails, Converter={tools:ReverseListConverter}}"

Is there a way to do this with a generic Converter in XAML?


Solution

  • You can forget about making a generic converter a markup extension, you cannot simply create generic objects in XAML (there are some cases in which you can in .NET 4, don't know if anything changed in 4.5).

    One way to create an instance would be using a helper class which contructs an instance for you (i wrote one in another question's answer).