2011-12-10 35 views
1

我有一個列表框,其ItemSource綁定到CollectionViewSource。 CVS來源是XmlDataProvider。所以列表框列出了我指定的所有節點(名稱屬性)。 現在這些節點有屬性,我希望列表框被它們排序。 問題是,由於底層數據是xml,每個值(節點的屬性)都是一個字符串,但其中一些值表示數值。由於使用CollectionViewSource.SortDescriptions.add (...)進行排序將按字母順序對這些(字符串)值進行排序,因此2,10,5的排序將按10,2,5而不是2,5,10進行排序。 我該如何解決這個問題?在列表框中排序的數字字符串

如果解決方案位於ListView的CustomSort中,有人請給我一個關於如何使用底層XmlDocument的快速例子嗎?

我認爲這會像編寫實現IComparer的類一樣簡單,但不知何故我迷路了。 我想將屬性的名稱傳遞給方法,所以我可以從CVS中「提取」所有這些屬性,將它們轉換爲float(在這種情況下)並將它們與標準函數進行排序... 但是我完全失去了對這個CustomSort是如何工作的,說實話....

希望這是可能的,而不開溝XmlDocument的,因爲它是一種給定的:)

問候

+0

如果您正在閱讀的數據中只有一部分是數字,那麼您打算如何實施整體排序?我的意思是,如果你有一個2,10,5,5a的序列,那應該怎麼看?是否所有的非數字都在按數字順序排序的數字之前或之後? –

+0

沒有字母數字字符串。只是像「名稱」這樣的屬性可以被解釋爲字符串並像他們一樣排序,但其他像「年齡」那樣存儲爲sting(因爲它是一個XmlAttribute),但我希望它被作爲數值處理。在其他部分,我只是使用轉換器來實現這一點,但我不知道如何告訴特定的sortdescription先轉換,或者如何解決這個問題,而不是使用xmldocument,而是爲數據結構創建一個自己的類。不幸的是,這是出了問題..... – ch40s

回答

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); 
    } 
} 
+0

這也可以用xaml來實現嗎? – Natrium

+0

我不這麼認爲...... –