2013-01-31 28 views
1

我有C#\ WPF應用程序,它只是在列表框控件中顯示一個變量名稱及其值的列表。當用戶點擊刷新按鈕時,該列表將被重新創建,併爲變量創建新的值。一些變量可能已經改變,而有些變量保持不變。需要關於字符串排序列表的一些想法

我希望自上次刷新以來已更改的值位於列表框的頂部,但無法想到一個優雅的方式來解決此問題。任何想法或例子將不勝感激。

謝謝!

+0

用javascript存儲當前值,並與新值進行比較。如果不同,請將它們放在堆棧頂部。如果沒有,將它們放在底部。 –

+0

你的數據結構是什麼樣的? –

+0

喬爲什麼要用javascript來存儲這些值,例如他可以做'List .Sort()'例如..?不是一個好的建議btw – MethodMan

回答

1

而不是具有作爲名稱/值對的對象的列表,請將其視爲具有Name/Value/IsChanged屬性的對象的列表。更新對象列表時,您可以適當地設置IsChanged,並將IsChanged用作排序的一部分。

特別是,不要認爲這是對字符串列表進行排序。你有一個變量列表,它有屬性(name,value,isChanged)。您的列表框綁定到CollectionViewListbox.Items給你的那個,或者你從CollectionViewSource得到的那個)。那CollectionViewSortDescriptions就可以了,你可以先設置IsChanged,然後按Name排序。

2

如果給你的列表項目(模型)一些額外的功能,以便簡單地服務視圖,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}}"/> 

假設您的模型實現INotifyPropertyChangedListOfModelsObservableCollection,這一切都將採取自動排序完成。

1

可能有更多的選擇:

  1. 保持當前列表的狀態。加載新列表。使用linq Except來查看差異。在頂部創建一個新的列表,其結果爲Except,其餘順序如下。
  2. 擴大您的項目與Timestamp,這將標記,項目創建時。選擇一個時間間隔,如何舊的項目應該在最上面。讀取新的值,並且滿足條件的那些(間隔中的最新值)置於頂部。或者你可以按TimeStamp排序。
1

使用類似:

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); 

我沒有測試代碼,咬了想法應該很清楚。

參見:Using LINQ to remove elements from a List<T>

0

我喜歡傑夫的想法,但它需要額外的邏輯在每次用戶更新列表時重置IsChanged值。嘗試爲您的名稱/值對添加時間戳,並在每次更新值時更新時間戳。然後,只需將時間戳添加到您的排序。

相關問題