2012-06-15 10 views
5

Ho una finestra WPF che visualizza diverse viste autodefinite. Finora sono stato in grado di utilizzare tutto ciò che ho imparato su MVVM :)Associazione di più viste a più modelli di visualizzazione

Ora ho avuto un nuovo "problema": ho 10 entità della stessa vista in una vista più grande. Queste dieci entità di visualizzazione contengono un insieme di controlli (casella di testo, casella combinata ecc.) Ma sono tutti coerenti.

Quindi, come si collegano queste viste a un ViewModel?

Ho pensato di avere 10 istanze del ViewModel nel ViewModel "di livello superiore" e dare alle viste definite le istanze della VM come datacontext.

La mia domanda è ora -> Esiste un modo più semplice (o più conveniente) per associare molte visualizzazioni (identiche) ai loro modelli di visualizzazione?

Codice-Esempio:

Vista Modello:

private PanelViewModel _panelViewModel1 = new PanelViewModel(); 
public PanelViewModel PanelVM1 
{ 
    get { return _panelViewModel1; } 
} 

View-Esempio:

<myControls:vwPanel HorizontalAlignment="Left" x:Name="vwPanel1" 
        VerticalAlignment="Top" DataContext="{Binding Path=PanelVM1}"/> 

Quello che mi dà fastidio è che avrei avuto bisogno di questa logica dieci volte per dieci viste ?

UPDATE: rispondere ad alcune domande: voglio mostrare un punto di vista 10 volte (nel mio esempio) ho definito il mio punto di vista ereditando da UserControl. Quindi il mio vwPanel eredita da UserControl. I 10 vwPanel sono appena posizionati all'interno di uno StackPanel all'interno di una griglia.

Non si tratta di visualizzare dati, come hai sottolineato, ci sarebbe un listview o un datagrid un posto migliore per iniziare. E 'un caso particolare in cui ho bisogno di questo tanto di ingresso-comandi:/

UPDATE2: quello che speravamo era più simile a definire un elenco di ViewModels e si legano i miei 10 Visualizzazioni a uno di questo elenco. Ma questo non funzionerà, vero? Almeno non saprei come fare riferimento ad una "speciale" entrata nell'elenco XAML ...

+1

Le dieci viste nella vista più grande sono definite in modo specifico? In altre parole, c'è qualche ragione per cui non è possibile, ad esempio, creare un elenco e associare tale elenco a un oggetto IEnumerable dei tuoi ViewModels e visualizzarli in questo modo? – Tim

+0

@Tim Ho bisogno di loro nell'ordine corretto per inserire e stampare nell'ordine corretto. Sarebbe possibile senza averli appositamente definiti? – basti

risposta

8

In genere utilizzo implicito DataTemplates per mappare Views a ViewModels.Possono andare in <Application.Resources>, <Window.Resources> o anche meno di elementi specifici solo come <TabControl.Resources>

<DataTemplate DataType="{x:Type local:PanelViewModel}"> 
    <myControls:vwPanel /> 
</DataTemplate> 

Ciò significa che ogni volta WPF incontra un oggetto nella VisualTree di tipo PanelViewModel, trarrà utilizzando vwPanel

Oggetti tipicamente essere condotti in VisualTree attraverso un ItemsSource proprietà

<ItemsControl ItemsSource="{Binding CollectionOfAllPanels}" /> 

o utilizzando a ContentControl

<ContentControl Content="{Binding PanelVM1}" /> 
+0

Ma cosa sono ancora in grado di "identificare" questi? Voglio dire in MVVM hai l'ordine V-> VM-> M. Le mie opinioni conoscono la loro VM corretta usando la tua soluzione? Soprattutto se le Proprietà nella VM vengono cambiate da questa macchina virtuale di livello superiore? – basti

+0

@chiffre, l'ordine in cui le macchine virtuali vengono visualizzate nei vostri itemsControl è l'ordine esatto in cui vengono aggiunti alla raccolta ItemsSource. Quindi, usando l'esempio di Rachel, se aggiungi 3 viewmodels a "Panels", verranno visualizzati nell'ordine in cui li aggiungi. Quando si seleziona il primo e si modifica una proprietà su di esso, il viewmodel nell'indice 0 di Panels avrà la proprietà modificata. Per quanto riguarda la notifica della vista quando la VM di livello superiore cambia un'altra VM, finché la VM implementa correttamente INotifyPropertyChanged, starai bene. – Thelonias

+0

@chiffre Non sono sicuro al 100% di aver capito la tua domanda. Da quanto ho capito, la VM contiene 10 proprietà 'PanelViewModel' che si desidera visualizzare utilizzando lo stesso identico' Panel' UserControl. A seconda di come i tuoi pannelli sono elencati nella VM, puoi visualizzarli usando qualcosa come 'ItemsControl' (se sono memorizzati in un 'ObservableCollection'), o un' ContentControl' (se sono memorizzati in 10 proprietà separate) . Il 'DataContext' dietro il' PanelUserControl' sarà qualunque cosa 'PanelViewModel' è legato a, quindi sì visualizzeranno i dati corretti quando aggiornati dalla VM genitore – Rachel

1

Se comprendo correttamente la tua domanda, hai una raccolta di qualcosa che devi rappresentare visivamente. Ovvero, hai diversi viewmodels per cui vuoi definire una singola vista, ma mostra il numero X di volte. Il tuo esempio mostra che stai usando un pannello come vista per "PanelViewModel" ... qual è il controllo dell'articolo genitore per il vwPanel? Supponendo che tu stia utilizzando qualcosa come un ListBox, puoi definire un DataTemplate personalizzato che contiene il tuo vwPanel e assegnare il DataTemplate al tuo ListBox.ItemTemplate.

Ad esempio:

<Window.Resources> 
    <DataTemplate x:Key="myVMTemplate" TargetType="{x:Type myViewModels:PanelViewModel}"> 
     <myControls:vwPanel HorizontalAlignment="Left" VerticalAlignment="Top"/> 
    </DataTemplate> 
</Window.Resources> 

<ListBox ItemsSource="{Binding Path=MyCollectionOfPanelVMs}" 
     ItemTemplate="{StaticResource myVMTemplate}" /> 

non ho verificato che questo funziona.

Problemi correlati