変数名とその値のリストをリスト ボックス コントロールに表示するだけの C#\WPF アプリがあります。ユーザーが [更新] ボタンをクリックすると、変数の新しい値でリストが再作成されます。一部の変数は変更されている可能性がありますが、一部は同じままです。
前回の更新以降に変更された値をリストボックスの一番上に表示したいのですが、これを行うエレガントな方法が思いつきません。任意のアイデアや例をいただければ幸いです。
ありがとうございました!
リスト アイテム (モデル) に、単にビューを提供することを目的とした追加の機能 (viewmodel スタイル) を与えるのが最善です。もちろん、モデルを純粋に保ちたい場合は、モデルをビューモデル内にラップすることもできます。
たとえば、設定可能なChanged
プロパティをモデルに与えることができます (または、Value
値が変更されるたびにプロパティ セッターが自動的に変更できます)。このプロパティを使用しListBox
て、ボックスがバインドされているコレクション ビューを並べ替えることで、アイテムを並べ替えることができます。
<CollectionViewSource x:Key="SortedModels" Source="{Binding ListOfModels}">
<CollectionViewSource.SortDescriptions>
<SortDescription PropertyName="Changed"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
<ListBox ItemsSource="{Binding Source={StaticResource SortedModels}}"/>
INotifyPropertyChanged
モデルが を実装し、ListOfModels
が であると仮定すると、ObservableCollection
ソートが自動的に行われるのに必要なのはそれだけです。
Name
名前と値のペアであるオブジェクトのリストを持つ代わりに、 / Value
/IsChanged
プロパティを持つオブジェクトのリストと考えてください。オブジェクトのリストを更新すると、IsChanged
適切に設定できIsChanged
、並べ替えの一部として使用できます。
特に、これを文字列のリストのソートと考えないでください。name
プロパティ ( 、value
、 )を持つ変数のリストがありますisChanged
。CollectionView
あなたのリストボックスは(Listbox.Items
あなたに与えるもの、またはあなたが得たもの)にバインドされていますCollectionViewSource
。最初に並べ替え、次に で並べ替えるように設定できCollectionView
ます。SortDescriptions
IsChanged
Name
おそらくもっと多くのオプションがあります:
Except
を使用して違いを確認します。Except
上の結果と下の残りの順序で新しいリストを作成します。Timestamp
アイテムが作成されたときにマークする でアイテムを拡張します。どのくらい古いアイテムを一番上に置くか、間隔を選択します。新しい値を読み取り、条件を満たすもの (間隔内の最新のもの) を上に置きます。または、それで並べ替えることができますTimeStamp
。次のようなものを使用します。
var olditems = new Hashset<string>(listbox.items); // or List<T>
List<string> newitems = getNewItems();
newitems = newitems.RemoveAll(x => olditems.Contains(x));
listbox.Items.Clear();
listbox.Items.Add(newitems);
listbox.Items.Add(olditems);
私はコードをテストしていませんが、アイデアが明確になるはずです。
Jeff のアイデアは気に入っていますが、ユーザーがリストを更新するたびに IsChanged 値をリセットする追加のロジックが必要です。名前と値のペアにタイム スタンプを追加し、値が更新されるたびにタイム スタンプを更新してみてください。次に、タイムスタンプを並べ替えに追加します。