ciao ragazzi
mi sono appena iscritto a questo forum, è da poco che ho iniziato a programmare in c# WPF.
ho un piccolo problema con MVVM, in pratica non riesco a fare il ViewModel del selectedItem di datagrid con il selectedItem di un ListView in una finestra modale.
datagrid è inizializzato con una tabella ordini che è associata ad articoli, e la lista articoli è nel ListView della window modale.
bindando il datacontext della Window Articoli con datagrid.selecteditem, al ritorno non riesco ad avere i valori di ListView.selectedItem
nella window principale faccio wArticoli.datacontext = datagrid.selecteditem
e nel Button di conferma della window articoli faccio datacontext = ListView.SelectedItem
non ho nessun aggiornamento !!!
qualcuno saprebbe dirmi dove sbaglio ?
Ciao Fabio,
scusami se ti rispondo in ritardo, aiutami a capire bene il tuo problema, vuoi che sostanzialmente il selected item della grid sia il datacontext della listbox della view che si apre in maniera modale?
stai usando qualche libreria che ti aiuti ad implementare mvvm?
gli oggetti che stai spostando da un lato all'altro (supponendo che ogni elemento della grid sia un viewmodel) implementano l'interfaccia INotifyPropertyChanged?
scusami se più che risposte, ti pongo altre domande, ma vorrei capire qual'è il tuo problema, ammesso che tu non l'abbia già risolto
ciao Nezumi
grazie per avermi risposto !
si....lo scenario è più o meno quello che hai descritto.
non sto usando nessuna implementazione per MVVM.
per quando riguarda l'interfaccia INotifyPropertyChanged è una cosa che sto appunto iniziando a capire come fare !!
purtroppo non ho grande conoscenza di WPF, ed a ogni evento che devo sviluppare, prima devo studiarci sopra per capire.
Il concetto MVVM mi è chiaro, ho fatto dei semplici test, e penso di aver capito come funziona.
ma non in questo caso:
Quello che faccio per far funzionare il tutto:
in sostanza modifico l' ID di associazione della tabella Dettaglio con Articoli, per avere un'altra riga di Articoli.
Per modificare l'ID, seleziono nella finestra modale la riga di ListView, ed assegno a textboxID (che è in Binding con DataGird.SelectedItem, e contiene l'ID di associazione di Dettaglio con Articoli) l'ID della riga di Articoli selezionata.
ma così facendo a RealTime non vedo modificare niente !! devo rigenerare il datagrid per poter vedere i valori modificati.
non credo sia il modo giusto !
(a parte che scrivo molto codice !)
se invece modifico i valori della tabella Articoli,(aprendo un'altra finestra modale in modalità MVVM dalla Window dovè la ListView, poichè devo avere la possibilità nella stessa Window di inserire o modificare un articolo) , a ReaTime vedo modificare anche i valori nel DataGrid.
sia il datagrid che ListView sono bindati all'istanza della tabella di EDM
spero di essere stato chiaro.
grazie infinite
allora il problema penso sia alla base,per una buona implementazione di mvvm gli eventi non servono a nulla se non per operazioni di pura natura grafica (far partire storyboard o cose del genere) ...tralasciando questo concetto, ho l'impressione che il problema sia che al motore di binding non viene notificato che hai cambiato qualcosa (e questo avviene tramite l'interfaccia INotifyPropertyChanged) in pratica l'oggetto che è la tua riga (che se ho ben capito hai creato come viewmodel) deve far partire un evento "PropertyChanged" (al quale il binding engine si sottoscrive) per poter gestire i cambiamenti per esempio
public class MioViewModel : INotifyPropertyChanged
.....
public const string MyPropertyName = "MyProperty"; private string _myProperty; public string MyProperty { get { return _myProperty; } set { _myProperty= value; RaisePropertyChanged(MyPropertyName); } }
dove RaisePropertyChanged è implementato così
protected void RaisePropertyChanged (string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); }
dove PropertyChanged è l'evento esposto dall'interfaccia INotifyPropertyChanged
Gli elementi della tua lista implementano questa interfaccia?
quindi il "nocciolo" è lì !?
no...ancora nessun elemento implementa PropertyChanged.....ripeto....è una cosa su cui sto studiando come fare !
potresti per favore darmi qualche dritta su come fare questa implementazione ?!
Nezumi: public class MioViewModel : INotifyPropertyChanged ..... public const string MyPropertyName = "MyProperty"; private string _myProperty; public string MyProperty { get { return _myProperty; } set { _myProperty= value; RaisePropertyChanged(MyPropertyName); } } dove RaisePropertyChanged è implementato così protected void RaisePropertyChanged (string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } dove PropertyChanged è l'evento esposto dall'interfaccia INotifyPropertyChanged
ti basta prendere spunto da questo codice, per iniziare
scusami....
MioViewModel sarebbe la tabella di EDM e MyPropertyName la proprietà ?!?
anzi la soluzione ottimale sarebbe inserire questo metodo in una classe base, e poi ereditare la stessa da tutti i tuoi viewmodel in modo da non dover riscrivere sempre il metodo RaisePropertyChanged
anche se su ogni proprietà voglio implementare ArgumentNullException ?
no no assolutamente no, se per edm intendiamo la stessa cosa, beh quello è considerabile come il tuo "modello" nel pattern MODEL - VIEW - VIEWMODEL
ma purtroppo le classi di entity framework non implementano quell'interfaccia, potresti farti riversare da EF i dati in classi che implementano INotifyPropertyChanged, se utilizzassi un approccio code-first volendo
allora...dimmi se vado bene:
nella classe di implementazione devo copiare pari pari nome tabella e proprietà di EDM,
nella fattispecie devo implementare tutte le proprietà di Dettaglio e tutte le proprietà di Articoli
a cosa serve questa riga ?
public const string MyPropertyName = "MyProperty";
Fabio Miceli: public const string MyPropertyName = "MyProperty";
ti serve semplicemente per non sbagliare a scrivere il nome della property, in realtà potresti usare un approccio basato sulla reflection per evitare di sbagliare nome...magari ti posto il codice questa sera a casa
io però nel MVVM utilizzo le stesse proprietà di EDM (Entity Data Model) ......
provo un po a scrivere !!!! (spero di capirci)
ti sarei molto grato se riesci a mandarmi qualche informazione in più....
grazie infinite.....
scusami Nezumi ma ci voglio capire bene:
tutti controlli le Window, DataGrid, ListView ComboBox etc.. della mia App le ho bindate istanziandole direttamente ad EDM.
adesso che devo fare questa implementazione,devo scrivere tutte le classi, ma le devo scrivere con lo stesso nome e le stesse proprietà di EDM ??
perchè se faccio così quando lancio l'app mi da questo errore:
Errore 1 Modificatore parziale mancante nella dichiarazione del tipo 'iGenius.SubDettaglioCommesse'. È presente un'altra dichiarazione parziale di questo tipo C:\Users\Fabio\Documents\Visual Studio 2010\Projects\iGenius\iGenius\PropertyChanged.cs 9 18 iGenius
come non detto....mi ero dimenticato di mettere la classe in una cartella !!!!!!
Associazione Culturale DotNetCampania - C.F.: 95127870632