我有C#\ WPF應用程序,它只是在列表框控件中顯示一個變量名稱及其值的列表。當用戶點擊刷新按鈕時,該列表將被重新創建,併爲變量創建新的值。一些變量可能已經改變,而有些變量保持不變。需要關於字符串排序列表的一些想法
我希望自上次刷新以來已更改的值位於列表框的頂部,但無法想到一個優雅的方式來解決此問題。任何想法或例子將不勝感激。
謝謝!
我有C#\ WPF應用程序,它只是在列表框控件中顯示一個變量名稱及其值的列表。當用戶點擊刷新按鈕時,該列表將被重新創建,併爲變量創建新的值。一些變量可能已經改變,而有些變量保持不變。需要關於字符串排序列表的一些想法
我希望自上次刷新以來已更改的值位於列表框的頂部,但無法想到一個優雅的方式來解決此問題。任何想法或例子將不勝感激。
謝謝!
而不是具有作爲名稱/值對的對象的列表,請將其視爲具有Name
/Value
/IsChanged
屬性的對象的列表。更新對象列表時,您可以適當地設置IsChanged
,並將IsChanged
用作排序的一部分。
特別是,不要認爲這是對字符串列表進行排序。你有一個變量列表,它有屬性(name
,value
,isChanged
)。您的列表框綁定到CollectionView
(Listbox.Items
給你的那個,或者你從CollectionViewSource
得到的那個)。那CollectionView
有SortDescriptions
就可以了,你可以先設置IsChanged
,然後按Name
排序。
如果給你的列表項目(模型)一些額外的功能,以便簡單地服務視圖,viewmodel樣式是最好的 - 當然如果你想讓它們保持純粹的,你可以將你的模型包裝在viewmodels中。例如,你可以給你的模型一個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
,這一切都將採取自動排序完成。
可能有更多的選擇:
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);
我沒有測試代碼,咬了想法應該很清楚。
我喜歡傑夫的想法,但它需要額外的邏輯在每次用戶更新列表時重置IsChanged值。嘗試爲您的名稱/值對添加時間戳,並在每次更新值時更新時間戳。然後,只需將時間戳添加到您的排序。
用javascript存儲當前值,並與新值進行比較。如果不同,請將它們放在堆棧頂部。如果沒有,將它們放在底部。 –
你的數據結構是什麼樣的? –
喬爲什麼要用javascript來存儲這些值,例如他可以做'List .Sort()'例如..?不是一個好的建議btw –
MethodMan