反向列表框没有排序

时间:2011-09-13 16:47:36

标签: wpf listbox observablecollection

我花了两周的时间试图找出一种方法,以相反的顺序显示列表框中的项目,而不使用任何排序属性,并且不在我的实体中放置任何表示逻辑,我只是​​希望最后插入的项目显示在列表框的顶部。 我发现的唯一纯XAML解决方案是WPF reverse ListView,但它不是那么优雅。我还试图覆盖我的BindableCollection的GetEnumerator()(我使用Caliburn Micro作为MVVM框架)来返回一个枚举器,它以相反的顺序迭代我的集合项,但是id不起作用。 我该怎么办?

1 个答案:

答案 0 :(得分:2)

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}}"/>