反转ListBox项目(按“无”降序排序)

时间:2009-02-10 12:46:50

标签: .net wpf sorting listbox

是否可以按原始顺序对WPF ListBox中的项目进行反向排序?我的意思是你可以使用SortDescriptions按某些属性进行排序,但是如果我只需要以相反的顺序显示这些项目而没有真正的字段来排序呢?

注意:我不想对原始集合进行排序或克隆它等等。我知道如何做到这一点,但我正在寻找一种方法让ListBox这样做仅用于演示。

由于

3 个答案:

答案 0 :(得分:1)

这有点难看,但它会颠倒listbox1中ListBoxItems的顺序。你无法做到显而易见的事情:使用单个临时变量并在每次循环迭代时交换两个元素。您收到运行时错误,“元素已经有一个逻辑父级。必须先将其与旧父级分离,然后才能将其附加到新父级。”。

using System;
using System.Windows;
using System.Windows.Controls;

namespace ReverseListbox
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            ItemCollection items = this.listbox1.Items;
            for (int i = 0, j = items.Count - 1; i < j; i++, j--)
            {
                object tmpi = items[i];
                object tmpj = items[j];
                items.RemoveAt(j);
                items.RemoveAt(i);
                items.Insert(i, tmpj);
                items.Insert(j, tmpi);
            }
        }
    }
}

以下是完整样本的XAML:

<Window x:Class="ReverseListbox.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <ListBox Name="listbox1" Grid.Row="0">
            <ListBoxItem Content="1" />
            <ListBoxItem Content="2" />
            <ListBoxItem Content="3" />
            <ListBoxItem Content="4" />
        </ListBox>
        <Button Name="button1" Grid.Row="1" Click="Button_Click" />
    </Grid>
</Window>

答案 1 :(得分:0)

一个便宜的答案是向数据对象添加一个新的整数字段,并为每个项目增加此字段。然后,您可以对此字段进行反向排序。我知道这可能不是一个可行的解决方案。

如果您使用集合视图进行排序,我相信您总是必须根据某些属性或条件进行排序。排序将基于实现IComparer的比较对象。此接口比较两个对象并确定哪个更大。除非您有某种方法可以通过比较来确定如何订购两件商品,否则您无法撤消对此的排序。

答案 2 :(得分:0)

我有一段时间遇到过类似的问题。我最终解决了它与Josh G的帖子类似,但使用了一些封装来避免污染域对象。

请参阅this discussion thread

我用于仅由UI使用的集合的另一种方法(例如,日志消息)是首先通过collection.Insert(0, item);以相反的顺序插入它们。