変数名とその値のリストをリスト ボックス コントロールに表示するだけの 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ます。SortDescriptionsIsChangedName
おそらくもっと多くのオプションがあります:
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 値をリセットする追加のロジックが必要です。名前と値のペアにタイム スタンプを追加し、値が更新されるたびにタイム スタンプを更新してみてください。次に、タイムスタンプを並べ替えに追加します。