Перевернутый список без сортировки - PullRequest
1 голос
/ 13 сентября 2011

Последние две недели я потратил, пытаясь выяснить способ отображения элементов списка в обратном порядке, без использования какого-либо свойства сортировки и без добавления логики представления в мои сущности. Я просто хочу, чтобы последний вставленный элемент отображался в верхняя часть списка. Единственное чистое решение XAML, которое я нашел, - это WPF обратный ListView , но оно не так уж и элегантно. Я также попытался переопределить GetEnumerator () моей коллекции BindableCollection (я использую Caliburn Micro в качестве среды MVVM), чтобы вернуть перечислитель, который перебирает элементы моей коллекции в обратном порядке, но id не работает. Как я могу это сделать?

1 Ответ

2 голосов
/ 14 сентября 2011

ScaleTransform является элегантным решением для этого конкретного случая, но могут быть более общие приложения (например, привязка одного и того же списка, но с применением разных перестановок).

Это можно сделать с помощью преобразователей, еслиубедитесь, что привязка к списку, а не элементы списка.Предполагая, что вы используете ObservableCollection строк (уверен, что можно будет использовать обобщения и отражения, чтобы сделать это более элегантным) и упускаете все правильное кодирование обработки исключений и множественных вызовов Convert ...

public class ReverseListConverter : MarkupExtension, IValueConverter
{
    private ObservableCollection<string> _reversedList;

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

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

        var data = (ObservableCollection<string>) 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<string>)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();
    }
}

Затем вы можете связать в своем XAML что-то вроде

<ListBox ItemsSource="{Binding Converter={ReverseListConverter}}"/>
...