Реверсирование элементов ListBox (сортировка по убыванию «ничего») - PullRequest
4 голосов
/ 10 февраля 2009

Можно ли отсортировать элементы в WPF ListBox в обратном порядке по сравнению с их первоначальным порядком? Я имею в виду, что вы можете использовать SortDescriptions для сортировки по какому-либо свойству, но что если мне просто нужно показать элементы в обратном порядке без реального поля для сортировки?

Примечание. Я бы предпочел не сортировать оригинальную коллекцию и не клонировать ее и т. Д. Я знаю, как это сделать, но я ищу способ заставить ListBox делать это только для презентации.

Спасибо

Ответы [ 3 ]

1 голос
/ 11 февраля 2009

Это немного некрасиво, но оно изменит порядок ListBoxItems в listbox1. Вы не можете сделать очевидную вещь: использовать одну временную переменную и поменять местами два элемента за цикл итерации. Вы получаете ошибку времени выполнения: « Элемент уже имеет логического родителя. Он должен быть отсоединен от старого родителя, прежде чем он будет присоединен к новому. ».

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>
0 голосов
/ 24 апреля 2009

У меня была похожая проблема некоторое время назад. В итоге я решил эту проблему аналогично посту Джоша Г., но использовал немного инкапсуляции, чтобы избежать загрязнения объекта домена.

См. эту ветку обсуждения .

Другой метод, который я использую для коллекций, которые используются только пользовательским интерфейсом (например, сообщения журнала), - это просто вставить их в обратном порядке, во-первых, через collection.Insert(0, item);.

0 голосов
/ 11 февраля 2009

Дешевый ответ - добавить новое целочисленное поле к объекту данных и увеличить его для каждого элемента. Затем вы можете отменить сортировку по этому полю. Я понимаю, что это может быть нереализуемым решением.

Если для сортировки вы используете представление коллекции, я считаю, что вам всегда нужно сортировать по какому-либо свойству или условию. Сортировки будут основаны на объекте сравнения, который реализует IComparer. Этот интерфейс сравнивает два объекта и определяет, какой из них больше. Вы не можете изменить сортировку, если у вас нет способа определить, как заказать два предмета, сравнив их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...