Newsgroup: it.comp.dotnet
Titolo: wpf evento new row sul datagrid

Salve
ho questo quesito, forse semplice ma non ne esco.
Un datagrid è in binding con una ObservableCollection<MyType> e devo 
permettere al cliente l'input dei dati direttamente nella griglia.
Al termine di ogni row, premendo enter il datagrid presenta ovviamente 
una row vuota, ma in quel momento devo fare delle operazioni sulla row 
appena inserita per ottenere un risultato che deve andare in una cella 
della stessa row.
Non riesco ad intercettare correttamente questo evento.
Se provo col key_down/key_up del datagrid pari a key.enter, non trovo 
ancora nella ObservableCollection l'ultimo item inserito (strano perche 
il .count è corretto, ma l'ultimo item è vuoto).
Se provo con l'evento CollectionChanged della O.C. che gli fa da 
datasource, non c'e evento all'Enter, ma solo quando si comincia a 
digitare sulla nuova row.
Come fareste ?
Grazie Alessandro

 Come fareste ?
così come sei non lo puoi sapere perchè non ti puoi mettere in mezzo 
tra la creazione e l'aggiunta, il tutto è gestito da una roba che se 
non ricordo male si chiama CollectionViewSource che sta tra la tua 
DataSource (la ObservableCollection<T>) e l'ItemsControl.
Quello che puoi fare è cambiare la tua data source in qualcosa di più 
complesso ed evoluto come la IEntityView<T> che trovi qui:
http://radical.codeplex.com
, è roba mia quindi se ti serve una mano per 
iniziare chiedi pure qui.
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it


Grazie Mauro, pero quello che devo fare è una operazione semplice e 
basilare in una applicazione gestionale.  Permettimi di dire che non è 
incoraggiante sapere che bisogna ricorrere a qualcosa di piu complesso 
ed evoluto del framework 4.0 e Wpf per fare questa cosa, in cui non si 
richiede nulla di particolare. Rimango personalmente dell'idea che wpf è 
eccellente su alcuni aspetti, ma rimane discutibile su altri.
Grazie
Alessandro

 eccellente su alcuni aspetti, ma rimane discutibile su altri.
Non posso che quotarti in pienissimo!
Al3x

 il .count è corretto, ma l'ultimo item è vuoto).
In che senso vuoto? null?

 Alessandro


 funzioni allo stesso modo non fa altro che complicare le cose.
Mi permetto di rispondere io perchè sono un newbie come Sander. Sapevo
benissimo che sarebbe stato un disastro ma è uno dei motivi per cui ho
cambiato lavoro quello di imparare cose nuove.
Io penso che Sander sia sconcertato (come me) non tanto dalle
difficoltà/diverse cose ma da due cose sostanzialmente:
1. dal fatto che per fare molte cose occorre usare strumenti esterni
in maniera pesante cosa che di certo c'era anche nel vecchio mondo
(winform ma soprattutto per me winform in VB6) ma molto meno
"obbligatoria"...
2. per fare certe cose occorre fare dei giri che sembrano (anche
quando spiegati da chi "ne sa") incasinati all'inverosimile come giri
di codice/istruzioni...
Detto questo, proseguo con lo studio e con il lavoro di test per
partire tra non molto con un progettone-one-one...
Al3x

 di codice/istruzioni...
Il problema è che state cercando l'approccio simil windows forms e 
questo vi frega in corner, Wpf ha una cosa potentissima che è il motore 
di Data Binding (quello di Windows Forms a confronto è un giochetto da 
sfigati) e con quello si può fare tutto, quindi è mandatory usare 
Model-View-ViewModel altrimenti ci si fa male. E' poi fondamentale 
capire come funzionano gli stili, i template e i trigger (o/e il 
VisualStateManager) perchè se devi customizzare ad esempio le colonne 
di una ListView e cerchi di farlo da codice piangi in cinese per capire 
dietro le quinte come il motore di rendering di DirectX genera, per 
inciso in maniera asincrona, gli elementi e peggio ancora come li 
virtualizza e ricicla.


 dell'informatica.
Questo per dire che ad uno sviluppatore web probabilmente non 
passerebbe per l'anticamera del cervello di aprire fireworks... il vero 
inghippo è che Wpf ci mette a disposizione cose, ad esempio le 
animazioni, che prima erano semplicemente impossibili e le aziende 
devono capire che il dev quelle cose non le deve fare (punto) :-) ci 
sono i designer apposta, che usano Blend perchè sono abitauti ad usare 
Illustrator...se a me chiedono cosa è una curva di Bezier gli rido in 
faccia e mi spavento :-)


 passerebbe per l'anticamera del cervello di aprire fireworks...
Per ora concordo... vedremo cosa mi toccherà fare in futuro...
Al3x

 capire come funzionano gli stili, i template e i trigger
Sì a questo ci sono arrivato abbastanza tranquillamente, per lo meno
in via teorica mi sono chiari e lineari!
Al3x

 dev quelle cose non le deve fare (punto) :-) ci sono i designer apposta,
Mauro...
ahahahahah  ahahahaha bwahahahaha ahahahahah
perdonami non me ne volere, non ho resistito
non tutte le aziende là fuori sono Gaia... ;-)
dammi retta, vivi una realtà aziendale molto particolare
saluti
Roberto

> richiede nulla di particolare.
un esempio per fare una cosa simile introducendo "l'elemento più 
complesso":
http://www.codewrecks.com/blog/index.php/2011/02/23/filtering-in-mvvm-architecture/


 dammi retta, vivi una realtà aziendale molto particolare
Roby, non ci siamo capiti: se hai a che fare con strumenti non tuoi è 
perchè probabilmente non ci sono le figure che devono usare quegli 
strumenti ma dire che è colpa della tecnologia forse è l'approccio 
sbagliato.
Devo fare un'animazione 3D in Flash e mi tocca usare 3D Studio Max per 
preparare gli elementi vettoriali...che merda Flash che mi obbliga ad 
ausare 3D Studio Max... forse non è proprio colpa di Flash.


 ma di certo leggo più velocemente l'italiano :-)
purtroppo no, non lo uso, mi spiace.



scusate se mi riaggancio alla mia risposta e non al flow principale, ma 
mi sfugge proprio l'apporccio usato, vorrei capire meglio.
Per fare questo indico quello che probabilmente avrei tentato io:
associare a Enter un command del mio viewmodel che contiene la 
observablecollection (tramite attached property di tipo ICommand, mi 
sembra che qualcuno lo chiami "attached command"), il command in 
questione deve gestire la creazione di un nuovo elemento T, valorizzarlo 
(vuoto) e fare l'insert dello stesso nella observablecollection che in 
quanto tale e in quanto bindata con la datagrid notifica da sola la 
propertychanged, dunque dovresti ritrovarti con la datagrid aggiornata 
senza toccare il lato UI.
A questo punto, editando la row per la prima volta in realtà tu aggiorni 
il dato T vuoto, non lo crei.
Ripeto, non so se ho capito bene, ma anziché aggiungere un elemento al 
componente e riempirlo con i dati, forse dovresti fare il contrario, 
lavorare sul dato, POI aggiungere alla collection che dovrebbe 
notificare al componente il cambiamento, e solo a quel punto, editando 
il componente, editi i dati sottostanti.


Ho messo su una semplicissima soluzione, utilizzando concetti sempre 
validi e molto semplici. Visto che il datagrid è associato ad una 
ObservableCollection<miaclasse> ( a questo punto credo che una semplice 
List<miaclasse> sarebbe sufficiente), nei metodi SET delle property di 
miaclasse ho semplicemente fatto calcolare il dato richiesto sulla base 
degli altri inseriti direttamente nella grid, e questo dato magicamente 
appare al volo nella grid. Bellissimo, tanto quanto semplice.
Alessandro

 appare al volo nella grid. Bellissimo, tanto quanto semplice.
Ottimo, se ti funziona e se è semplice probabilmente e fino a prova 
contraria è il metodo migliore. Se usavi una List dovevi solo aggiungere 
nelle set la notifica per la PropertyChanged.
A questo punto, solo per curiosità, quando premevi enter, chi è che 
creava la nuova row, era una cosa che avevi fatto tu lato code behind 
intercettando la pressione del tasto?


La nuova row viene creata in automatico dal datagrid alla pressione di 
enter..ti propone una nuova riga su cui inserire i dati ( è una 
richiesta del cliente, io non faccio MAI scrivere nelle grid). Il bello 
è che proprio in questo istante ( ignorando eventi vari che stavo 
cercando), avvengono le SET su <miaclasse>, ed è lì che ho vinto io :)