【问题标题】:Silverlight listbox orderbySilverlight 列表框 orderby
【发布时间】:2011-03-20 14:13:54
【问题描述】:

有没有办法订购这个 Silverlight 绑定的 ListBox。我不确定我的填充方式是否容易?

此处的代码示例:

  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 或 'miles' 是它需要上升的数字。 代码有点乱,不能完全正确,但你明白了。

【问题讨论】:

  • so miles 独立于来自 XML 的数据,您想按那个排序吗?
  • 嗨,是的,'miles' 是从上面示例中缺少的一些代码生成的。 (基本上算出您离特定位置的距离)
  • 编辑了我的问题/代码以帮助了解我在做什么。

标签: c# silverlight list listbox


【解决方案1】:

最简单的方法是使用一个列表,它绑定到列表框:

        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 项目上的 Miles 属性替换为您计算里程数的方式。

【讨论】:

  • 谢谢,编辑了我的问题/代码以帮助您了解我在做什么。很抱歉有任何混淆。
  • 添加到列表是正确的方法。您可以使用 Linq 对属性进行排序 - elements.OrderBy(i =&gt; i.Distance)
【解决方案2】:
 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));

        }

【讨论】:

  • 您好,谢谢,这看起来不错,但是 .AddRange 在 Items 之后是什么? Items 没有扩展名。
  • 您好,感谢 SOE,AddRange 没有出现。这是因为我的 ListBox 的“msa”来自 System.Windows.controls。因此我得到的错误消息:错误1'System.Windows.Controls.ItemCollection'不包含'AddRange'的定义,并且没有接受'System.Windows.Controls.ItemCollection'类型的第一个参数的扩展方法'AddRange'可以找到(您是否缺少 using 指令或程序集引用?) C:\Users\Dan\Documents\Visual Studio 2010\Projects\msa_uk\msa_uk\Nearest.xaml.cs 118 27 msa_uk。这是一个基于 silverlight 的 Windows Phone 7 项目,如果有差异的话。
猜你喜欢
  • 2018-11-19
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 2011-01-12
  • 2011-05-27
  • 1970-01-01
相关资源
最近更新 更多