列表框中的数字字符串排序

时间:2011-12-10 01:40:00

标签: wpf sorting collectionviewsource xmldataprovider

我有一个ListBox,ItemSource绑定到CollectionViewSource。 CVS来源是XmlDataProvider。因此ListBox列出了我指定的所有节点(名称属性)。 现在这些节点有属性,我希望ListBox按它们排序。 问题是,由于底层数据是xml,每个值(节点的属性)都是一个字符串,但有些值代表数值。由于使用CollectionViewSource.SortDescriptions.add (...)进行排序将按字母顺序对这些(字符串)值进行排序,因此2,10,5的序列将被排序为10,2,5而不是2,5,10。 我该如何解决这个问题?

如果解决方案位于ListView的CustomSort中,有人可以提供一个关于如何使用底层XmlDocument的快速示例吗?

我认为这就像写一个实现IComparer的类一样容易,但不知怎的,我迷失了。 我想将属性的名称传递给方法,所以我可以从CVS中“提取”所有这些属性,将它们转换为float(在本例中)并使用标准函数对它们进行排序... 但我完全迷失了这个CustomSort的工作原理......

希望这可以在不放弃XmlDocument的情况下实现,因为它是一种给定的:)

此致

1 个答案:

答案 0 :(得分:2)

如果要绑定到继承自IList的集合,则可以从ListView控件的ItemsSource属性中检索ListCollectionView。一旦有了ListCollectionView的实例,就可以为CustomSorter属性分配一个排序方法。

自定义排序器必须继承旧样式,非通用IComparer。在Compare方法中,您将获得绑定类的两个实例。你可以根据需要投射那些来获得你想要的结果。在开发期间,您可以将调试器锚定在Compare方法中,以确切确定对象是什么。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        List<string> strings = new List<string>() { "3", "2", "10", "1" };
        lv1.ItemsSource = strings;
        ListCollectionView lcv = 
             CollectionViewSource.GetDefaultView(lv1.ItemsSource) as ListCollectionView;
        if(lcv!=null)
        {
            lcv.CustomSort = new MySorter();
        }
    }
}
public class MySorter : IComparer
{
    public int Compare(object x, object y)
    { // set break point here!
        return Convert.ToInt32(x) - Convert.ToInt32(y);
    }
}