我有一个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的情况下实现,因为它是一种给定的:)
此致
答案 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);
}
}