2011-12-10 11 views
1

私は、ItemSourceがCollectionViewSourceにバインドされているListBoxを持っています。 CVSソースはXmlDataProviderです。したがって、ListBoxは指定したすべてのノード(name属性)をリストします。 これらのノードには属性があり、リストボックスを並べ替える必要があります。 問題は、基になるデータがxmlであるため、すべての値(ノードの属性)は文字列ですが、値の一部は数値を表します。 CollectionViewSource.SortDescriptions.add (...)でソートすると、それらの(文字列)値がアルファベット順にソートされるため、2,10,5のシーケンスは2,5,10の代わりに10,2,5としてソートされます。 どうすればこの問題を解決できますか?リストボックス内の数字列の並べ替え

解決策がListViewのCustomSortにある場合、誰かが私に基礎的なXmlDocumentでこれを行う方法の簡単な例を教えてください。

私は、IComparerを実装するクラスを書くのは簡単だと思っていましたが、どういうわけか私は迷っています。 私は属性の名前をメソッドに渡したいので、CVSからそれらの属性をすべて "抽出"し、浮動小数点数(この場合は)に変換し、標準関数で並べ替えることができます... しかし、私はそれが与えられたの一種であるため、完全に

希望....このCustomSortは、正直に言うとどのように機能するかに失われたこれは、XmlDocumentオブジェクトを捨てることなく可能である:)

よろしく

+0

読んでいるデータの一部しか数値でない場合は、全体的な並べ替えをどのように実装する予定ですか?私は、もしあなたが2,10,5、5aのシーケンスを持っていたら、どのように見えるのでしょうか?数値以外のすべての数値は、数値順にソートされた数値の前後に移動しますか? –

+0

英数字の文字列はありません。 "name"のような属性は、文字列やorderdのように解釈されますが、それはXmlAttributeであるためにスティッキングとして格納される "age"のようなものですが、数値として扱われることを望みます。他の部分では、これを達成するために単純にコンバータを使用しますが、最初に変換する特定のsortdescriptionを指定する方法や、xmldocumentを使用せずにデータ構造用の独自のクラスを作成する以外の方法についてはわかりません。残念ながら、これは質問..... ..... – ch40s

答えて

2

あなたが結合している場合IListから継承するコレクションは、ListViewコントロールのItemsSourceプロパティからListCollectionViewを取得できます。 ListCollectionViewのインスタンスを取得したら、CustomSorterプロパティにソート方法を割り当てることができます。

カスタムソーターは、旧式の非汎用IComparerから継承する必要があります。 Compareメソッド内では、バインドされたクラスの2つのインスタンスを取得します。必要に応じてそれらをキャストして、望みの結果を得ることができます。開発時に、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

私はそうは思わない... –

関連する問題