locked
Silverlight e M-V-VM ... un inghippo... RRS feed

  • Domanda

  • Prendiamo il classico caso Ordine - Prodotti.

    Io ho OrdineVM e ProdottoVM

    All'interno dell'OrdineVM ho creato una property che istanza un HandlerProdottiVM e quest'ultimo espone una lista di elementi ProdottoVM.

    Faccio tutto questo affinchè io possa riutilizzare ProdottoVM in diverse parti.

    Il problema nasce quando ho tutto nella stessa pagina. Quindi ho una datagrid con la lista degli ordini,e sotto il dettaglio dei prodotti dell'ordine. L'HandlerProdottiVM viene creato du richiesta, in particolare sulla Get, e viene effettuata la query sul DB.

     

    Il codice è quindi:

    public HandlerProdotti ListaProdottiVM{

    get
                {

                    if (this._HandlerProdotti == null)
                    {
                        this._HandlerProdotti = new HandlerProdotti (this);
                    }
                   
                    return _HandlerProdotti ;
                }
    }

     

    Nel costruttore di HandlerProdotti viene effettuata la Load dei prodotti dell'ordine. La prima volta che seleziono l'ordine e che quindi viene effettuata la load dei prodotti, la datagrid slave si aggiorna, quando invece torno sull'ordine precedentemente selezionato la griglia non si aggiorna più rimane con i dettagli dell'ultimo elemento. Se metto un RaisePropertyChanged nel VM padre verso la lista del VM figlio allora tutto funziona correttamente. Mi spiegate dove sbaglio? Uso male il pattern M-V-VM?

    mercoledì 9 giugno 2010 16:03

Risposte

  • Entramble le proprietà devono esporre delle liste usando ObservableCollection<T>, quando l'item selezionato parent cambia (e questo il VM lo sa perchè hai bindato la proprieta SelectedItem della datagrid parent) il viemodel ricarica il contenuto della observablecollection figlia con i nuovi dati.

     

     


    Corrado Cavalli [Microsoft .NET MVP-MCP]
    UGIdotNET - http://www.ugidotnet.org
    Weblog: http://blogs.ugidotnet.org/corrado/
    Twitter: http://twitter.com/corcav
    • Contrassegnato come risposta bab76 giovedì 10 giugno 2010 21:28
    giovedì 10 giugno 2010 21:07
    Postatore

Tutte le risposte

  • se ho capito bene direi che è tutto giusto come è pure giusto che tu
    debba notificare alla "griglia" che il contenuto dei prodotti è
    cambiato.
     
    ..m
     
     
     

    Mauro Servienti
    {C67C0157-5D98-4733-A75E-93CAEE4BADC8}
    Microsoft MVP - Visual C# / MCP
    http://mvp.support.microsoft.com
    blog @ http://milestone.topics.it
    whynot [ at ] topics [ dot ] it
    giovedì 10 giugno 2010 03:37
  • Però in realtà non è cambiato il contenuto. Nel senso, che il padre è cambiato, mentre il figlio non è cambiato. E' li in memoria già bello che pronto.

    Devo notificare lo stesso?

    giovedì 10 giugno 2010 07:34
  • allora mi sono perso per strada qualche cosa, puoi descrivere meglio il
    giro del funmo?
     
    ..m
     
     
     

    Mauro Servienti
    {C67C0157-5D98-4733-A75E-93CAEE4BADC8}
    Microsoft MVP - Visual C# / MCP
    http://mvp.support.microsoft.com
    blog @ http://milestone.topics.it
    whynot [ at ] topics [ dot ] it
    giovedì 10 giugno 2010 07:40
  • Praticamente la prima volta l'ordine ha l'handler a null, viene istanziato, carica i prodotti e quindi avviene un notifychanged. La seconda volta però ce l'ha già in memoria e quindi il notifychanged non avviene (ce l'ha già in memoria)
    giovedì 10 giugno 2010 12:16
  • Non ho capito esattamente lo scenario, tieni però presente che il meccanismo di binding, giustamente, non aggiorna la destinazione se non ci sono cambiamente, quindi se l'istanza non cambia puoi invocare il RaisePropeertyChanged tutte le volte che vuoi ma la destinazione non riceverà nulla.
    Corrado Cavalli [Microsoft .NET MVP-MCP]
    UGIdotNET - http://www.ugidotnet.org
    Weblog: http://blogs.ugidotnet.org/corrado/
    Twitter: http://twitter.com/corcav
    giovedì 10 giugno 2010 12:32
    Postatore
  • Si si, infatti il problema è proprio quello.

    Vediamo se riesco a farmi capire meglio, nel master ho una datagrid con la lista degli ordini. Quindi ho una property per l'ordineVM selezionato, collegato in binding con la datagrid. In OrdineVM ho la property ListaProdottiVM messa in binding con la datagrid slave. Nella get di quest'ultima property se la variabile locale è nulla faccio la load. Quando la load è stata eseguita c'è un raisepropertychanged della property ListaProdottiV. Questo Raise però viene effettuato solo la prima volta, mentre le altre volte non c'è. Ora se suddivido i compiti, quindi un designer per la grafica, e un coder per il ViewModel, come fa il coder a pensare di dover lanciare un property changed della lista di dettaglio se in effetti non è cambiato nulla?

    giovedì 10 giugno 2010 12:45
  • Entramble le proprietà devono esporre delle liste usando ObservableCollection<T>, quando l'item selezionato parent cambia (e questo il VM lo sa perchè hai bindato la proprieta SelectedItem della datagrid parent) il viemodel ricarica il contenuto della observablecollection figlia con i nuovi dati.

     

     


    Corrado Cavalli [Microsoft .NET MVP-MCP]
    UGIdotNET - http://www.ugidotnet.org
    Weblog: http://blogs.ugidotnet.org/corrado/
    Twitter: http://twitter.com/corcav
    • Contrassegnato come risposta bab76 giovedì 10 giugno 2010 21:28
    giovedì 10 giugno 2010 21:07
    Postatore
  • Si, infatti alla fine ho fatto come dici tu, solo che se non avessi visto il problema con il designer non mi sarebbe venuto naturare rifare la load figlia, visto che l'avevo già in memoria. E' vero che però occupavo memoria di oggetti che forse non mi sarebbero mai serviti, però ecco, scrivendo solo codice senza vedere il designer non mi sarebbe venuto spontaneo!

     

    Grazie per l'attenzione di voi tutti

     

    giovedì 10 giugno 2010 21:21