WPFListBox
の項目を元の順序とは逆にソートすることはできますか? を使用して特定のプロパティで並べ替えることができるということですがSortDescriptions
、並べ替える実際のフィールドがなく、項目を逆の順序で表示する必要がある場合はどうすればよいでしょうか?
注: 元のコレクションを並べ替えたり、複製したりしたくないです。その方法は知っていますがListBox
、プレゼンテーションのみを行う方法を探しています。
ありがとう
これは少し見にくいですが、listbox1 の ListBoxItems の順序が逆になります。明らかなことはできません。単一の一時変数を使用し、ループの反復ごとに 2 つの要素を交換します。「要素にはすでに論理的な親があります。新しい親にアタッチする前に、古い親からデタッチする必要があります。」という実行時エラーが発生します。
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>
安価な答えは、新しい整数フィールドをデータ オブジェクトに追加し、これをアイテムごとにインクリメントすることです。次に、このフィールドで並べ替えを逆にすることができます。これが実行可能な解決策ではない可能性があることを理解しています。
コレクション ビューを使用して並べ替える場合は、常に何らかのプロパティまたは条件に基づいて並べ替える必要があると思います。並べ替えは、IComparer を実装する比較オブジェクトに基づいて行われます。このインターフェイスは 2 つのオブジェクトを比較し、どちらが大きいかを判断します。2 つのアイテムを比較して順序を決定する方法がない限り、この並べ替えを逆にすることはできません。
私はしばらく前に同様の問題を抱えていました。Josh Gの投稿と同様に解決しましたが、ドメインオブジェクトの汚染を避けるために少しカプセル化を使用しました。
このディスカッション スレッドを参照してください。
UI でのみ使用されるコレクション (ログ メッセージなど) に使用するもう 1 つの方法は、collection.Insert(0, item);
.