2012-04-23 3 views
0

В основном я использовал опубликованный конвертер here и просто изменил тип данных как общий. Как использовать общий конвертер внутри XAML?Общее использование IValueConverter C# WPF в 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(); 
    } 
} 

До конвертера был родовым я просто использовал

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

Есть ли способ сделать это с общим конвертером в XAML?

ответ

5

Вы можете забыть о создании универсального конвертера расширения разметки, вы не можете просто создавать общие объекты в XAML (there are some cases in which you can в .NET 4, не знаете, изменилось ли что-либо в 4.5).

Один из способов создать экземпляр будет использовать вспомогательный класс, который описывает экземпляр для вас (я написал один в another question's answer).

+1

Полностью не соответствует действительности: http://msdn.microsoft.com/en-us/library/ee956431.aspx –

+0

@DanPuzey: Позвольте мне перефразировать: для всех * практических целей *? –

+0

Арг, извините, вы правы. Должен был протестировать (и прочитать все) до того, как я разместил сообщение. Извиняюсь! (И если вы отредактируете свой ответ, я возьму -1.) –

Смежные вопросы