in wpf datagrid come ottenere la riga vuota in cima? cioè quando l'utente vuole aggiungere una nuova riga, arriva sempre in fondo. Ma voglio che sia al top ... posso farlo in XAML?in datagid wpf come ottenere la riga vuota in cima?
risposta
Questa risposta dipende in gran parte da come si sta vincolando il DataGrid, in particolare dal tipo sottostante di ItemsSource. Questa risposta presuppone che si stia utilizzando uno ObservableCollection. Dal momento che menzioni specificamente WPF, suppongo anche che tu intenda .NET 4.0, dato che DataGrid è disponibile solo in Silverlight 3 e .NET 4.0.
presumo che sei Newing una fila chiamando
ItemSource.Add(new MyObject());
Per ottenere il comportamento desiderato, utilizzare il seguente invece:
ItemSource.Insert(0, new MyObject());
Si dovrà scrivere il proprio modello per DataGrid in cui posizionare la parte NewItemPlaceholder sulla parte superiore della griglia. Guarda questo example per iniziare (anche se l'esempio non è la risposta ti indirizzerà nella giusta direzione).
Sulla nota a margine posso chiedere perché dovresti avere NewItemPlaceholder in alto? È come se rompesse il naturale flusso dal basso verso l'alto che siamo così abituati a vedere quando si tratta di elenchi/griglie.
Potrebbe essere più intuitivo avere la voce Nuovo elemento in basso e l'opzione Inserisci oggetto nel menu di scelta rapida per la griglia o qualcosa del genere. Questa è solo la mia opinione, naturalmente.
Se stai usando un approccio MMVM, è possibile aggiungere una nuova fila come programmaticamente:
var newEmp = new EmployeeViewModel(new EmployeeDto());
EmployeeList.Add(newEmp);
EmployeeList.Move(EmployeeList.IndexOf(newEmp), 0);
Nel mio esempio sto utilizzando un EmployeeListViewModel per visualizzare un'ObservableCollection di EmployeeViewModels.
Quindi è anche possibile scrivere test per questo comportamento. più controllo che in XAML ....
/Johan
+1 soluzione pulita –
Che dire NewItemPlaceholderPosition.AtBeginning? Non ho un esempio di codice ma sembra essere quello che stai descrivendo. Puoi sempre fare ciò che Johan suggerisce e spostare o ordinare gli elementi nella griglia a livello di programmazione.
Esempio di codice aggiunto da Ray Burns:
var view = CollectionView.GetDefaultCollectionView(EmployeeList)
as IEditableCollectionView;
if(view!=null)
view.NewItemPlaceholderPosition = NewItemPlaceholderPosition.AtBeginning;
Si noti che questo richiede .NET Framework 3.5 o superiore.
Risposta eccellente woodyiii (+1). Ho aggiunto del codice e una nota sulla versione di NET Framework per rendere la tua risposta ancora più interessante. –
.GetDefaultCollectionView non è un metodo sulla classe CollectionView (4.0). CollectionViewSource.GetDefaultView (oggetto) è la stessa cosa? – Michael
@RayBurns Si prega di aggiornare il codice per quanto riguarda .NET Framework. Il codice non funziona per v4 e successivi .. –
Ooh nice .. thas one way .. ma questo è simulare l'effetto add row ... devi scrivere gestori di eventi e gestire tutto ... posso farlo e grazie per il suggerimento. sto usando .net 3.5 datagrid .. penso che sia la sua beta e lo faccio esattamente come tu hai menzionato .... altre idee? – kedar
DataGrid è disponibile per .NET 3.5 se si installa WPF Toolkit, disponibile su codeplex. – Dave