我有一个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);
}
}