1

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

解決策がListViewのCustomSortにある場合、基礎となるXmlDocumentを使用してこれを行う方法の簡単な例を教えてください。

IComparerを実装するクラスを書くのと同じくらい簡単だと思いましたが、どういうわけか私は迷子になりました。属性の名前をメソッドに渡したかったので、CVSからすべての属性を「抽出」し、それらをfloat(この場合)に変換して、標準関数で並べ替えることができました...しかし、私は完全に失われましたこのCustomSortが正直にどのように機能するかについて...

XmlDocumentを捨てることなくこれが可能であることを願っています、なぜならそれは一種の与えられたものだからです:)

よろしく

4

1 に答える 1

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