2016-04-12 5 views
1

Ich habe eine ObserverableCollection in meiner WPF-Anwendung und ich möchte es nach einer Eigenschaft sortieren. Betrachten:Hinzufügen und Einfügen von Objekt in sortierte ObservableCollection

var MyCollection = new ObserverableCollection<MyViewModel>; 

wo MyViewModel eine Eigenschaft SortOrder haben, die eine ganze Zahl zurückgibt, die seine Position in der Sammlung repräsentieren. Die Ganzzahl muss nicht für jedes Objekt mit 1 beginnen oder um 1 inkrementieren.

Ich kann die Objekte auf einem wpf-Canvas (wie Ordner und Symbole auf dem Desktop) physikalisch bewegen und der SortOrder hängt von der Position ab. Wenn ich also ein Objekt verschiebe, muss ich seine Position in der Sammlung aktualisieren.

Ich muss auch Objekte zur Sammlung hinzufügen, also wie kann ich das tun und gleichzeitig sicherstellen, dass die Objekte nach SortOrder geordnet sind?

Die Sammlung enthält normalerweise zwischen 1-30 Elemente.

+0

Kennen Sie schon [diese] (http://stackoverflow.com/questions/1945461/how-do-i-sort-an -observable-Sammlung)? – Pikoh

+0

Werfen Sie einen Blick auf [Bindung an Sammlungen/Sammlungsansichten] (https://msdn.microsoft.com/de-de/library/ms752347 (v = vs.100) .aspx # binding_to_collections) – Clemens

Antwort

0

Mit Inspiration aus, this Sie eine Erweiterung erstellen können wie:

public static class Extensions 
{ 
    public static void Sort<TSource, TKey>(this ObservableCollection<TSource> collection, Func<TSource, TKey> keySelector) 
    { 
     List<TSource> sorted = collection.OrderBy(keySelector).ToList(); 
     for (int i = 0; i < sorted.Count(); i++) 
      collection.Move(collection.IndexOf(sorted[i]), i); 
    } 
    public static void AddSort(this ObservableCollection<MyViewModel> collection, MyViewModel newItem) 
    { 
     var index = collection.Where(x => x.SortOrder) < newItem.SortOrder)).Count(); 
     collection.Insert(index, newItem); 
    } 
} 
Verwandte Themen