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



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

如果解决方案在于ListView的CustomSort,请有人给我提供一个快速的例子,如何与底层XmlDocument?

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

希望这是可能的,而不放弃XmlDocument,因为它是一种给定的:)

如果你绑定了一个继承自listlist的集合,你可以从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);
    }
}

相关内容

  • 没有找到相关文章

最新更新