2009-02-10 1 views
4

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

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

Благодаря

ответ

0

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

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

+0

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

1

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

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

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

См. this discussion thread.

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

Смежные вопросы