2013-05-12 18 views
5

Desidero che il modello di vista principale abbia un determinato elenco e quindi acceda da molti altri modelli di visualizzazione.Accesso a una proprietà in un ViewModel da un altro

Ad esempio, in MainViewModel.cs avrò un elenco di 50 numeri, quindi in NumListViewModel.cs, mi piacerebbe accedervi per mostrarlo come un elenco, e in AddNumViewModel.cs I ' Mi piacerebbe essere in grado di aggiornare quella lista.

È stato suggerito di utilizzare eventi/evenaggerator, cosa che ho fatto, ma sfortunatamente, per quel che ne so tutto ciò che posso fare è inviare un numero da una vista a un'altra e dirgli di aggiornare la lista, ma il il problema è che, man mano che il programma cresce, avrò bisogno di avere molti abbonati nel modello di visualizzazione principale, e quando qualcosa accade realmente dovrò "pubblicare" eventi in base al numero di abbonati che rende ancora più difficile da mantenere.

Ho anche trovato un'altra risposta, istruendo di creare un'istanza di anotherVM all'interno del mainVM, con un parametro impostato su "this" che è un riferimento al mainVM. Funziona, ma poi di nuovo, potrebbe diventare piuttosto lungo.

Quindi la mia domanda è, c'è un migliore modo per accedere a una proprietà da un'altra VM?
Come letteralmente avere un'istanza della classe che detiene l'elenco in mainVM e quindi essere in grado di aggiornarlo/accedervi dalle altre VM, senza dover programmare esplicitamente quale VM può. Renderebbe la vita molto più facile

Nella tua risposta, cerca di evitare di suggerire i quadri. Anche se ce ne sono alcuni veramente buoni, voglio essere in grado di farlo almeno da solo.

Ad esempio:

MainVM.cs:

public class MainVM 
{ 
    List lst = new List(); //Let's just say it's full... 
} 

OtherVM.cs:

public class OtherVM 
{ 
    lst.Add(3); 
} 

PS: sì lo so che è stato chiesto già, e sì che hanno fatto la mia ricerca, MA le risposte che ho trovato sono troppo 'statiche', immagino?

+1

Usa Prism per risolvere istanza del MainViewModel. –

risposta

11

Se volete diretta accesso alla lista da un ViewModel esterno, quindi le opzioni sono:

  1. Far passare l'elenco al OtherVM come argomento del costruttore o di proprietà pubblica. Quindi l'OtherVM può trattarlo come un membro.

  2. Passare MainVM a OtherVM come argomento del costruttore o proprietà pubblica. Quindi OtherVM può accedere alla lista accedendo per la prima volta a MainVM.

  3. Assegna a MainVM una proprietà statica denominata "Predefinito" o "Istanza", in modo da poter accedere all'istanza statica di MainVM da OtherVM, senza assegnarlo come campo membro.

Esempio:

public class MainVM 
{ 
    private static MainVM _instance = new MainVM(); 
    public static MainVM Instance { get { return _instance; } } 

    public List<XX> MyList { get; set; } 
    //other stuff here 
} 

//From within OtherVM: 
MainVM.Instance.MyList.Add(stuff); 
+1

Grazie mille! L'opzione # 3 ha fatto il lavoro! Le opzioni 1 e 2 funzionano bene, ma man mano che il progetto cresce, dovrò passare l'istanza/elenco più di una volta, quindi suppongo che questa non sia una buona pratica per le applicazioni su larga scala. – Asaf

+0

@BTownTKD So che questa domanda è piuttosto vecchia ma ho un problema. Ho provato il tuo codice ma nell'ordine inverso. Ad esempio, ho dichiarato la proprietà Instance su OtherVM e desidero accedervi in ​​mainVM. Non ottengo alcun errore ma quando accedo a qualsiasi proprietà di OtherVM in MainVM non ottengo il valore di tale proprietà. Voglio dire, ottengo null invece del valore di quella proprietà. – Khushi

+0

Vuoi pubblicarlo come una nuova domanda. – BTownTKD

Problemi correlati