1

我有一个 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 中“提取”所有这些属性,将它们转换为浮点数(在这种情况下)并使用标准函数对它们进行排序......但我完全迷失了老实说,这个 CustomSort 是如何工作的......

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

问候

4

1 回答 1

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);
    }
}
于 2011-12-10T14:07:37.393 回答