2010-02-22 3 views

Antwort

0

Diese Antwort hängt stark davon ab, wie Sie Ihr DataGrid binden, insbesondere was der zugrunde liegende Typ Ihrer ItemsSource ist. Diese Antwort setzt voraus, dass Sie eine ObservableCollection verwenden. Da Sie WPF speziell erwähnen, nehme ich auch an, dass Sie .NET 4.0 meinen, da das DataGrid nur in Silverlight 3 und .NET 4.0 verfügbar ist.

Ich gehe davon aus, dass Sie newing bis eine Reihe sind durch

Aufruf
ItemSource.Add(new MyObject()); 

Um das Verhalten, das Sie wünschen, zu erhalten, verwenden Sie die folgende statt:

ItemSource.Insert(0, new MyObject()); 
+0

Ooh nett .. tas one way .. aber das simuliert den add row effect ... du musst Eventhandler schreiben und alles verwalten ... ich kann das und danke für den Tipp. ich benutze .net 3.5 datagrid .. ich denke, es ist beta und ich mache es genau so, wie du es erwähnt hast .... andere Ideen? – kedar

+1

Das DataGrid ist für .NET 3.5 verfügbar, wenn Sie das WPF-Toolkit installieren, das auf Codeplex verfügbar ist. – Dave

0

Sie müssten Ihre eigene Vorlage schreiben für DataGrid, in dem Sie den NewItemPlaceholder-Teil oben auf dem Raster platzieren würden. Schauen Sie sich zuerst example an (obwohl das Beispiel nicht die Antwort ist, wird es Ihnen in die richtige Richtung zeigen).

Auf der Randnotiz kann ich fragen, warum müssten Sie NewItemPlaceholder an der Spitze haben? Es bricht den natürlichen Fluss von oben nach unten, den wir so gewohnt sind, wenn wir mit Listen/Gittern arbeiten.
Es mag intuitiver sein, wenn Sie im unteren Bereich die Option Neues Element und im Kontextmenü für das Gitter oder etwas in dieser Richtung die Option Element einfügen haben. Das ist natürlich nur meine Meinung.

1

Wenn Sie einen MMVM Ansatz verwenden, können Sie eine neue Zeile programmatisch hinzufügen:

 var newEmp = new EmployeeViewModel(new EmployeeDto()); 
     EmployeeList.Add(newEmp); 
     EmployeeList.Move(EmployeeList.IndexOf(newEmp), 0); 

In meinem Beispiel ich eine EmployeeListViewModel bin mit einem ObservableCollection von EmployeeViewModels anzuzeigen.

Dann können Sie auch Tests für dieses Verhalten schreiben. Mehr Kontrolle als in XAML ....

/Johan

+0

+1 saubere Lösung –

8

Was NewItemPlaceholderPosition.AtBeginning? Ich habe kein Codebeispiel, aber das scheint das zu sein, was Sie beschreiben. Sie könnten immer tun, was Johan vorschlägt, und die Elemente im Raster programmatisch verschieben oder sortieren.

Codebeispiel hinzugefügt von Ray Verbrennungen:

var view = CollectionView.GetDefaultCollectionView(EmployeeList) 
      as IEditableCollectionView; 
if(view!=null) 
    view.NewItemPlaceholderPosition = NewItemPlaceholderPosition.AtBeginning; 

Beachten Sie, dass diese 3.5 NET Framework benötigt oder höher.

+0

Ausgezeichnete Antwort woodyiii (+1). Ich habe Code und einen Hinweis zur .NET Framework-Version hinzugefügt, um Ihre Antwort noch besser zu machen. –

+1

.GetDefaultCollectionView ist keine Methode für die CollectionView-Klasse (4.0). Ist CollectionViewSource.GetDefaultView (Objekt) die gleiche Sache? – Michael

+0

@RayBurns Bitte aktualisieren Sie den Code in Bezug auf .NET Framework. Der Code funktioniert nicht für v4 und höher. –

Verwandte Themen