Re: [問題] LonglistSelector
※ 引述《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
10/14 23:10, 3F
→
10/14 23:11, , 4F
10/14 23:11, 4F
→
10/14 23:11, , 5F
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
10/14 23:35, 6F
→
10/14 23:36, , 7F
10/14 23:36, 7F
→
10/14 23:36, , 8F
10/14 23:36, 8F
→
10/14 23:37, , 9F
10/14 23:37, 9F
在這方面上我還是會建議你用Binding的方式比較好
因為只要改了Binding的資料,Binding的控制項不用清掉再加進去就會自動更新
※ 編輯: hoyunxian 來自: 111.250.44.69 (10/14 23:45)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):