none
SortDescriptions funktionieren nicht richtig RRS feed

  • Frage

  • Hallo!


    Unter http://msdn.microsoft.com/en-us/library/ms745786.aspx findet sich ein rudimentäres Sortierbeispiel.
    Funktioniert problemlos, bis man den Typ der Listenelemente ändert (string und int hab ich getestet). Das Verhalten ist seltsam, die Auflistung wird einmal (falsch) sortiert und dann passiert nichts mehr.

    Zum Test habe ich eine eigene Klasse implementiert, die die "verdächtigen" Interfaces wie DateTime implementiert - einfach um zu sehen, was davon beim Sortieren verwendet wird. Das hatte keinen Erkenntnisgewinn zur Folge, lediglich Equals (!?) wird aufgerufen.
    Per Reflection hab ich mir die Implementierung (von ListCollectionView usw) angesehen. Leider sehr viel Code... 


    Wie bekomme ich eine solche Liste mittels SortDescriptions sortiert?


    Gruß
    Headi

    PS:
    http://sortablecollection.codeplex.com/ ist bekannt, aber nicht gewollt :)




    EDIT: Thx - ja manchmal sieht man den wald vor Bäumen nicht. Bin darauf reingefallen, dass ich beim Konstruktor der SortDescription als propertyName nicht null übergeben habe. Ich hatte nur eine primitiv-Collection. Leider sortiert das Ganze dann trotzdem, ohne zielgerichtetes Verhalten. Dank dem Beispiel hab ich das ganze noch mal neu zusammengesetzt und den Fehler gefunden - danke!
    • Bearbeitet Headi Mittwoch, 1. Juli 2009 18:55
    Montag, 29. Juni 2009 14:21

Antworten

  • Hallo Headi,

    da wird schon mit IComparable die gebundene Eigenschaft sortiert.
    In dem Beispiel wird an die Eigenschaften von DateTime gebunden,
    die dort alle Integer sind.

    Als Beispiel für ein Abwandlung des ListViewSort Beispieles.
    Zunächst der abgwandelte XAML Code für die ListViwe

            <ListView x:Name='lv' 
                Height="200" 
                GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler">
                <ListView.View>
                    <GridView>
                        <GridViewColumn 
                            Header="Name"
                            Width="120"
                            DisplayMemberBinding="{Binding Path=Name}" 
                        />
                        <GridViewColumn 
                            Header="Alter"
                            Width="40"
                            DisplayMemberBinding="{Binding Path=Alter}" 
                        />
                        <GridViewColumn 
                            Header="Datum"
                            Width="80"
                            DisplayMemberBinding="{Binding Path=Datum}" 
                        />
                    </GridView>
                </ListView.View>
            </ListView>

    Dazu eine kleine Beispiel Klassen an deren Eigenschaften (Name, Alter, Datum) gebunden wird:

        public class SampleClass
        {
            private static int __currentID;
    
            public static List<SampleClass> GetSampleList()
            {
                List<SampleClass> list = new List<SampleClass>();
                list.Add(new SampleClass("Meier", 47, new DateTime(2005, 6, 29)));
                list.Add(new SampleClass("Müller", 7, new DateTime(2005, 6, 30)));
                list.Add(new SampleClass("Schulze", 77, new DateTime(2005, 6, 28)));
                list.Add(new SampleClass("Heinrich", 17, new DateTime(2005, 7, 1)));
                list.Add(new SampleClass("Anders", 27, new DateTime(2005, 6, 26)));
                return list;
            }
    
            public SampleClass(string name, int alter, DateTime datum)
            {
                __currentID++;
                this.ID = __currentID;
                this.Name = name;
                this.Alter = alter;
                this.Datum = datum;
            }
    
            public int ID { get; private set; }
            public string Name { get; set; }
            public int Alter { get; set; }
            public DateTime Datum { get; set; }
        }
    
    Um die Beispieldaten zu binden, z. B.:
            public Window1()
            {
                InitializeComponent();
    
                lv.ItemsSource = SampleClass.GetSampleList();
            }
    
    Der Rest des Beispielcodes ist ansonsten unverändert.

    Gruß Elmar
    • Als Antwort markiert Headi Mittwoch, 1. Juli 2009 18:50
    Mittwoch, 1. Juli 2009 11:37