2013-10-21 12 views
6

Sto progettando un'applicazione WPF seguendo lo schema MVVM. In uno UserControl (e infatti questa situazione si verifica molte volte), dal momento che è piuttosto complessa, che include ad esempio, TabControl, mi piacerebbe dividerli in diversi sub UserControl. Ad esempio, nella vista "principale", chiamiamola MainUC, ho un TabControl, che ha due TabItem. Dal momento che sia TabItem comprende in realtà molti elementi dell'interfaccia utente, io disegno due UserControl, SubUCA e SubUCB, in modo che il XAML di MainUC si presenta così:Come inizializzare Vista nidificata (e ViewModel) senza utilizzare il risolutore di dipendenze in WPF/MVVM

<TabControl Name="mainUC" Grid.Row="0" > 
    <TabItem Header="Sub UC A" Name="SubUC1"> 
     <local:SubUCA /> 
    </TabItem> 
    <TabItem Header="Sub UC B" Name="SubUC2"> 
     <local:SubUCB /> 
    </TabItem> 
</TabControl > 

Ma ora la mia domanda è: come dovrei organizzare il ViewModel (s) per questi UserControl? Un modo, che sto attualmente usando, è solo avere una classe ViewModel (chiamata MainUC_VM), e il DataContext di MainUC è impostato su questa istanza di classe (si noti che non sto usando l'integrazione delle dipendenze, quindi creo solo un'istanza nel codice- dietro a MainUC). Ma in questo modo la classe MainUC_VM diventerebbe davvero complicata, proprio come la MainUC. Quindi vorrei anche dividere il ViewModel in diverse classi. Per esempio, nella classe MainUC_VM, posso avere tali proprietà

public SubUCA_VM SubVM1 { get; set; } 
public SubUCB_VM SubVM2 { get; set; } 

Tuttavia, dal momento che non sto usando l'iniezione di dipendenza (perché la nostra squadra non ha deciso di usarlo), come posso fare la SubVM1 e SubVM2 diventare il DataContext di SubUC1 e SubUC2 rispettivamente? Non riesco a crearne uno nel code-behind di SubUCA e SubUCB, poiché sarebbero diversi rispetto ai membri di proprietà in MainUC_VM.

Alcuni modi posso pensare sono, 1) rendono il singleton classi SubUCA_VM e SubUCB_VM (che è come lo stesso comportamento di iniezione di dipendenza ad esempio utilizzando, MEF di default), o 2) utilizzando EvengAggregator a notificare al instantiate della oggetto. Ma in entrambi i casi sembra aggiungere una complessità inutile secondo me. Significa che l'iniezione di dipendenza è quasi indispensabile per utilizzare MVVM? C'è mai un modo per ottenerlo senza l'uso di DI?

risposta

4

È possibile utilizzare modelli di dati impliciti per collegare i dati (VM) alle proprie visualizzazioni. Innanzitutto, definire i modelli di dati in un dizionario risorse disponibile per MainUC. Questo può essere nel controllo utente stesso o anche nelle risorse dell'applicazione. Questi modelli di dati indicano a WPF quali controlli utilizzare ogni volta che è necessario presentare i dati di un determinato tipo.

<UserControl.Resources> 
    <DataTemplate TargetType="{x:Type local:SubUCA_VM}"> 
     <local:SubUCA /> 
    </DataTemplate> 
    <DataTemplate TargetType="{x:Type local:SubUCB_VM}"> 
     <local:SubUCB /> 
    </DataTemplate> 
</UserControl.Resources> 

quindi associare il contenuto delle schede per il bambino VM:

<TabControl Name="mainUC" Grid.Row="0" > 
    <TabItem Header="Sub UC A" Content="{Binding SubVM1}" /> 
    <TabItem Header="Sub UC B" Content="{Binding SubVM2}" /> 
</TabControl> 

In alternativa, è possibile avere una lista del bambino VM nel vostro principale VM. Ogni VM figlio dovrebbe avere una proprietà Title in modo che il controllo struttura a schede possa utilizzarla per l'intestazione. In questo modo la VM principale può creare dinamicamente l'interfaccia utente. Avresti ancora bisogno dei modelli di dati definiti sopra.

<TabControl ItemsSource="{Binding Children}" DisplayMemberPath="Title" /> 
+0

Grazie! È davvero pulito! – tete

Problemi correlati