.net - unidimensional - se requiere obtener la suma de las cantidades contenidas en un arreglo de 10 elementos
Invertir elementos de ListBox(orden descendente por "nada") (3)
¿Es posible ordenar elementos en WPF ListBox
a la inversa de su orden original? Quiero decir que puedes usar SortDescriptions
para ordenar por alguna propiedad, pero ¿qué SortDescriptions
si solo necesito mostrar los artículos en el orden inverso sin un campo real para ordenar?
Nota: Preferiría no ordenar la colección original o clonarla, etc. Sé cómo hacerlo, pero estoy buscando una manera de hacer que ListBox
haga esto solo para presentación.
Gracias
Una respuesta barata sería agregar un nuevo campo entero al objeto de datos e incrementarlo para cada elemento. Luego puede revertir la ordenación en este campo. Entiendo que esta podría no ser una solución viable.
Si usa una vista de colección para ordenar, creo que siempre debe ordenar en función de alguna propiedad o condición. Las clases se basarán en un objeto de comparación que implemente IComparer. Esta interfaz compara dos objetos y determina cuál es más grande. No puede invertir el orden en esto a menos que tenga alguna forma de determinar cómo ordenar dos elementos comparándolos.
Esto es un poco feo, pero revertirá el orden de ListBoxItems en listbox1. No puede hacer lo obvio: use una única variable de temperatura e intercambie dos elementos por iteración de bucle. Obtiene un error de tiempo de ejecución, "El elemento ya tiene un elemento primario lógico. Debe separarse del anterior padre antes de que se adjunte a uno nuevo ".
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);
}
}
}
}
Aquí está el XAML para una muestra completa:
<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>
Tuve un problema similar hace un tiempo. Terminé resolviéndolo de manera similar a la publicación de Josh G pero usando un poco de encapsulación para evitar contaminar el objeto de dominio.
Ver este hilo de discusión .
Otro método que utilizo para colecciones que solo usa la UI (por ejemplo, mensajes de registro) es simplemente insertarlos en orden inverso en primer lugar, a través de collection.Insert(0, item);
.