Re: [問題] LonglistSelector

看板WindowsPhone作者 (WildDagger)時間12年前 (2013/10/14 20:24), 編輯推噓3(306)
留言9則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《songla1204 (TTP)》之銘言: : 機型:Nokia Lumia 920 : 問題詳述: : 我的程式有一個Longlistselector : 有一個ItemViewModel定義Item的格式 : 然後一個MainViewModel新增Item到Longlistselector : 以下是MainViewModel中的片段 : Deployment.Current.Dispatcher.BeginInvoke(new Action(() => : { : this.Station_Items.Add(new ItemViewModel() : { : A=a, : B=b, : C=c, : } : ); : })); : 這樣LonglistSelector中顯示由上到下的順序為先新增的item在上方 : 請問我想讓LonglistSelector由上而下的順序為C值的大小(C為double非string)順序 : 我該怎麼做呢? : 謝謝! 雖然不太清楚能不能共通, 不過清單類型的話通常是用List<ObjectModel> 或者是ObservableCollection<ObjectModel>, 然後再做資料綁定吧? 另外,ObservableCollection雖然可以即時反應清單的增減 但最大的問題是這個物件不能排序 相對的List在數量有增減的時候不會自動反映 但是相對的可以排序 (這邊請參考一下上官先生的部落格:http://tinyurl.com/m6djt47 順便想敲碗問續篇什麼時候才會出來(喂)) 那麼如何排序呢? 請參考這篇文章:http://tinyurl.com/l4sk39f 這裡簡單提一下我的作法 (個人的習慣是把所有資料類別獨立成DataType.cs, 然後把APP專用物件資料庫統整成DataSource.cs, 最後再於App.xaml.cs裡面加入以靜態物件宣告的專用資料庫 這樣就弄好可以綁定的物件資料庫了) 概略來說,就是自己去寫一個Sort函式 在這個時候必須要先用一個繼承IComparer<ObjectModel>的class 以我的空氣品質APP來說,因為我要排序的是PSI值 而我用的物件名稱是「PSIItem」 所以就要寫成這樣: public class IcpPSIOrder : IComparer<PSIItem> { } 不過只寫這樣還不夠,因為你沒有說要比較什麼 所以要追加int Compare方法 (比較回傳的是一個數值,會有1(A大於B)/0(A等於B)/-1(A小於B)三種結果) 所以這個方法要寫成這樣: public class IcpPSIOrder : IComparer<PSIItem> { public int Compare(PSIItem x, PSIItem y) { return x.PSI.CompareTo(y.PSI); } } 以物件的某個數值來排序的話,不用想太多,真的這樣寫就夠了 所以原PO你的ItemModel若要以C的大小來排序的話 就要寫成這樣: public class IcpItemModelOrder : IComparer<ItemModel> { public int Compare(ItemModel x, ItemModel y) { return x.C.CompareTo(y.C); } } 有了可以比較的方式後,接下來就是要叫List直接來排序了 首先把你的資料全部加入到一個List(在此用ItemList來代稱) 接著呼叫這個指令: ItemList.Sort(new IcpItemModelOrder()); 程式就會自動根據C的大小由小排到大 那麼如果程式需要的是由大排到小(例如我的APP就是從PSI最高排到最低)呢? 排完之後再呼叫一個指令就能夠自動把順序反過來: ItemList.Reverse; 如果清單不會有改變的問題,就直接把這個ItemList綁定就好 但如果會有改變的問題的話,就是ObservableCollection該登場的時候了 (這邊用ItemOC代稱) 用一個foreach迴圈就能把所有的List資料全部加入ObservableCollection裡面了 foreach(var a in ItemList) { ItemOC.Add(a); } 這樣就完結了 接下來直接把ItemOC綁定上去就是了。 不曉得這樣能不能幫上忙(汗) -- (本文已被刪除) [M ] (本文已被刪除) [ r ] (本文已被刪除) [ T ] (本文已被刪除) [ T ] (本文已被刪除) [ T ] (本文已被刪除) [ T ] -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.250.44.69

10/14 20:25, , 1F
謝謝大大 我都看無
10/14 20:25, 1F

10/14 21:46, , 2F
已收錄!
10/14 21:46, 2F

10/14 23:10, , 3F
看得有點一知半解 實力差太多了嗎 XD
10/14 23:10, 3F

10/14 23:11, , 4F
h大的意思是 將資料先弄成List的形式來使用sort()
10/14 23:11, 4F

10/14 23:11, , 5F
再將sort完的List item.add上longlistselector?
10/14 23:11, 5F
前面對了,不過我的意思是Binding 沒有錯的話應該這樣就會自動加進去了: (Longlistselector).ItemsSource = ItemList; 這樣子Longlistselector就會自動把你的清單給加進顯示清單呈現了 如果用ItemOC來綁定的話,ItemOC一有變化Longlistselector也會自動變化 不過在這之前別忘了設定DataTemplate(用XAML搭配{Binding (物件的資料欄位名稱)}), 不然Longlistselector會不知道你要怎麼呈現資料。 ※ 編輯: hoyunxian 來自: 111.250.44.69 (10/14 23:29)

10/14 23:35, , 6F
因為我是想說 我只要排序LLS裡面的ITEM就好
10/14 23:35, 6F

10/14 23:36, , 7F
不想要動太多東西
10/14 23:36, 7F

10/14 23:36, , 8F
我在想想看 這個方法 跟我先把資料存到Array sort完
10/14 23:36, 8F

10/14 23:37, , 9F
再依序ADD到LLS裡面哪個快好了!
10/14 23:37, 9F
在這方面上我還是會建議你用Binding的方式比較好 因為只要改了Binding的資料,Binding的控制項不用清掉再加進去就會自動更新 ※ 編輯: hoyunxian 來自: 111.250.44.69 (10/14 23:45)
文章代碼(AID): #1IM-AA1O (WindowsPhone)
討論串 (同標題文章)
文章代碼(AID): #1IM-AA1O (WindowsPhone)