2011-03-20 38 views
1

有沒有辦法訂購這個Silverlight綁定的ListBox。我不確定我填充的方式是否容易?Silverlight listbox orderby

代碼示例在這裏:

XElement _xml = XElement.Load("MSA.xml"); 
     { 
      msa.Items.Clear(); 

      foreach (XElement value in _xml.Elements("channel").Elements("msa")) 
      { 
       MSAFeedItem _item = new MSAFeedItem(); 
       _item.Lat = double.Parse(value.Element("lat").Value); 
       _item.Long = double.Parse(value.Element("long").Value); 
       _item.Name = value.Element("n").Value; 


double dis1 = _item.Lat - curLatitude; 
         double dis2 = _item.Long - curLongitude; 

        var miles1 = Math.Pow(dis1, 2.0); 
        var miles2 = Math.Pow(dis2, 2.0); 

        var miles3 = miles1 + miles2; 

        var miles4 = Math.Sqrt(miles3) ; 

        var miles = miles4 * 62.1371192; 

        _item.Distance = Decimal.Truncate(Convert.ToDecimal(miles)); 

       msa.Items.Add(_item); 

      } 
     } 

它需要根據被稱爲雙精度或十進制值按升序排列「英里」 ListBox中被稱爲「MSA」

非常感謝任何幫助或建議。

編輯:我添加了我的距離代碼,以幫助您瞭解發生了什麼,所以_item.distance或「英里」是它需要提升的數字。代碼是有點混亂,並不完全正確地工作,但你明白了。

+0

因此'英里'是獨立於來自XML的數據從你想排序? – 2011-03-20 14:19:51

+0

嗨是的,'英里'是從上面例子中缺少的一些代碼中產生的。 (基本上算出你是從一個特定的位置你有多少英里) – 2011-03-20 14:27:53

+0

編輯我的問題/代碼,以幫助理解我在做什麼。 – 2011-03-20 14:47:38

回答

1
XElement _xml = XElement.Load("MSA.xml"); 
     { 
      msa.Items.Clear(); 
      List<MSAFeedItem> tempItems = new List<MSAFeedItem>(); 

      foreach (XElement value in _xml.Elements("channel").Elements("msa")) 
      { 
       MSAFeedItem _item = new MSAFeedItem(); 
       _item.Lat = double.Parse(value.Element("lat").Value); 
       _item.Long = double.Parse(value.Element("long").Value); 
       _item.Name = value.Element("n").Value; 


       double dis1 = _item.Lat - curLatitude; 
       double dis2 = _item.Long - curLongitude; 

        var miles1 = Math.Pow(dis1, 2.0); 
        var miles2 = Math.Pow(dis2, 2.0); 

        var miles3 = miles1 + miles2; 

        var miles4 = Math.Sqrt(miles3) ; 

        var miles = miles4 * 62.1371192; 

        _item.Distance = Decimal.Truncate(Convert.ToDecimal(miles)); 

       tempItems.Add(_item); 

      } 

      tempItems.OrderBy(i => i.Distance).ToList() 
        .ForEach(e => msa.Items.Add(e)); 

     } 
+0

嗨謝謝,這看起來不錯,但Item後面的.AddRange是什麼?項目沒有擴展。 – 2011-03-20 15:01:51

+0

@Dan檢查出來http://msdn.microsoft.com/en-us/library/z883w3dc.aspx – 2011-03-20 15:02:39

+0

嗨,感謝SOE,AddRange未出現。它的'msa'是我的ListBox來自System.Windows.controls。因此錯誤消息即時得到:錯誤1'System.Windows.Controls.ItemCollection'不包含'AddRange'的定義和沒有擴展方法'AddRange'接受類型'System.Windows.Controls.ItemCollection'的第一個參數可以(缺少使用指令或程序集引用?)C:\ Users \ Dan \ Documents \ Visual Studio 2010 \ Projects \ msa_uk \ msa_uk \ Nearest.xaml.cs 118 27 msa_uk。這是一個基於Silverlight的Windows Phone 7項目,如果這樣做差異。 – 2011-03-20 15:09:50

2

去這裏最簡單的方法是使用一個列表,它結合到列表框中:

 var elements = new List<MSAFeedItem>(); 
     var comparison = new Comparison<MSAFeedItem>(
      (x, y) => { 
       if (x.Miles < y.Miles) return -1; 
       else if (x.Miles > y.Miles) return 1; 
       else return 0; 
      }); 
     foreach (XElement value in _xml.Elements("channel").Elements("msa")) 
     { 
      MSAFeedItem _item = new MSAFeedItem(); 
      _item.Lat = double.Parse(value.Element("lat").Value); 
      _item.Long = double.Parse(value.Element("long").Value); 
      _item.Name = value.Element("n").Value; 
      _item.Distance = Decimal.Truncate(Convert.ToDecimal(miles)); 
      elements.Add(_item); 
     } 

     elements.Sort(comparison); 

     msa.ItemsSource = elements; 

顯然取代X和與您計算的里程量的方式通過Y項萬里財產。

+0

謝謝,編輯我的問題/代碼,以幫助您瞭解我在做什麼。對於任何混淆抱歉。 – 2011-03-20 14:48:01

+1

添加到列表是正確的選擇。您可以使用Linq排序屬性 - 'elements.OrderBy(i => i.Distance)' – ChrisF 2011-03-20 14:52:29

+0

感謝您的建議! – 2011-03-20 15:27:06

相關問題