4

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

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

谢谢

4

3 回答 3

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>
于 2009-02-11T19:13:53.583 回答
0

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

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

于 2009-02-11T16:03:40.593 回答
0

不久前我遇到了类似的问题。我最终以类似于 Josh G 的帖子的方式解决了它,但使用了一些封装以避免污染域对象。

请参阅此讨论主题

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

于 2009-04-24T07:03:56.127 回答