DotNetCampania
Il primo portale campano dedicato allo sviluppo software con tecnologie Microsoft

MVVM c# WPF

rated by 0 users
Non risposto This post has 0 verified answers | 23 Replies | 2 Followers

Top 25 Partecipanti
23 Post
Punteggio 265
Fabio Miceli posted on 18 Jan 2012 17:46

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 ?

  • | Punteggio Post: 20

All Replies

Top 10 Partecipanti
Maschio
95 Post
Punteggio 1,330

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

  • | Punteggio Post: 20
Top 25 Partecipanti
23 Post
Punteggio 265

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

 

 

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
95 Post
Punteggio 1,330

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?

 

  • | Punteggio Post: 20
Top 25 Partecipanti
23 Post
Punteggio 265

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 ?!

  • | Punteggio Post: 5
Top 10 Partecipanti
Maschio
95 Post
Punteggio 1,330

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

  • | Punteggio Post: 20
Top 25 Partecipanti
23 Post
Punteggio 265

scusami....

MioViewModel  sarebbe la tabella di EDM e MyPropertyName la proprietà ?!?

 

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
95 Post
Punteggio 1,330

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

 

  • | Punteggio Post: 20
Top 25 Partecipanti
23 Post
Punteggio 265

anche se su ogni proprietà voglio implementare ArgumentNullException ?

  • | Punteggio Post: 5
Top 10 Partecipanti
Maschio
95 Post
Punteggio 1,330

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

  • | Punteggio Post: 5
Top 25 Partecipanti
23 Post
Punteggio 265

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";

  • | Punteggio Post: 20
Top 10 Partecipanti
Maschio
95 Post
Punteggio 1,330

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

  • | Punteggio Post: 20
Top 25 Partecipanti
23 Post
Punteggio 265

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.....

  • | Punteggio Post: 5
Top 25 Partecipanti
23 Post
Punteggio 265

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

  • | Punteggio Post: 5
Top 25 Partecipanti
23 Post
Punteggio 265

come non detto....mi ero dimenticato di mettere la classe in una cartella !!!!!!

  • | Punteggio Post: 5
Pagina 1 di 2 (24 elementi) 1 2 Avanti > | RSS

Associazione Culturale DotNetCampania - C.F.: 95127870632

Powered by Community Server (Commercial Edition), by Telligent Systems