2010-03-02 37 views
14

Sto cercando di utilizzare MVVM e mentre lo capisco per la maggior parte, c'è una cosa che non riesco a capire.MVVM Trasmissione dei dati alla finestra di dialogo Visualizza Modello

Immaginate di avere una combinazione View e ViewModel che mostra un elenco di foobars. Quando l'utente seleziona un foobar nella lista e fa clic sul pulsante di modifica, voglio che il foobar venga mostrato in una finestra di dialogo popup in modo che possa essere modificato. Questa finestra di dialogo (la vista) avrà il suo ViewModel associato.

Capisco che il pulsante possa essere associato a un comando nell'elenco ViewModel, ma da qui come faccio a creare un'istanza per l'editor di foobar?

1) Devo inviare un messaggio alla vista, che aprirà la finestra di dialogo? Se è così, questo non sconfigge lo scopo di avere il comando?

2) Come viene passato il foobar nel ViewModel per l'editor? Se è dal suo costruttore, non rende difficile dichiarare ViewModel in XAML?

Ritengo che questo sia l'ultimo pezzo del puzzle che mi impedisce di utilizzare MVVM e mi piacerebbe davvero ottenere una soluzione disaccoppiata a questo.

Grazie Matt

risposta

2

avrei forse farlo nel modo seguente:

  1. Il comando collegata al pulsante di modifica inizia finestra di modifica, la creazione di un custom ViewModel (VM) per esso. Il comando stesso dovrebbe essere forse nella VM della lista o nel modello (non del tutto sicuro).
  2. La VM di dialogo di modifica di Foobar ottiene un riferimento a Foobar al suo costruttore.
  3. Il foobar è clonato e il clone è modificato.
  4. Non appena l'utente preme OK nella finestra di dialogo di modifica del foobar, i valori del clone vengono riscritti nella foobar originale nella VM (e la finestra di dialogo è chiusa).

La necessità di un clone deriva dal fatto che l'utente non desidera vedere le modifiche nell'elenco di elementi foobar finché non accetta le modifiche nella finestra di modifica. Se tuttavia il montaggio online è corretto, il clone non è necessario.

Le modifiche vengono propagate automaticamente.

PS: sebbene io sia il fautore di MVVM, non sono sicuro che la mia soluzione sia ortodossa dal puro punto di vista MVVM.

1

This article da codeproject mostra un controllo Dialog WPF che fa esattamente quello che ti serve. Il motivo per cui questa implementazione è necessaria è che non è possibile inserire una finestra all'interno dell'albero visivo di altri controlli. Il che significa che WPF non ti consente di creare una finestra di dialogo. Quindi l'articolo sopra crea una sottoclasse ContentControl che crea una finestra.

In ogni modo, si mette questo nel tuo FooBarList View

<dialog:Dialog Content="{Binding Path=DialogViewModel}" /> 

è assicurarsi di avere qualcosa di simile in un dizionario risorse da qualche parte:

<Style TargetType="{x:Type dialog:Dialog}"> 
<Style.Triggers> 
    <Trigger Property="HasContent" Value="True"> 
    <Setter Property="Showing" Value="True" /> 
    </Trigger> 
</Style.Triggers> 
</Style> 

e basta scrivere qualcosa di simile (per WPF per funzionare è necessario implementare INotifyPropertyChanged):

public Class FooBarListViewModel 
{ 
    IList<FooBar> FooBarList {get;set;} 
    FooBar SelectedFooBar {get;set;} 
    ViewModelBase DialogViewModel {get;set;} 

    public EditFooBar(object param) 
    { 
    DialogViewModel = FooBar; 
    } 
} 

Per collegare il Vie w per modificare il FooBar al FooBar ViewModel solo fare qualcosa di simile (preferibilmente nelle Application.Resources quindi è globale)

<DataTemplate DataType={x:Type vm:FooBarViewModel}> 
    <vw:FooBarView/> 
</DataTemplate> 

(o, in alternativa: Utilizzare un IValueConverter per convertire ottenere il vostro Vista da una ViewModel like this post shows)

E poi sei pronto. Può sembrare molto, ma ti libera davvero molto.

+0

Questo è un approccio interessante. Osservando il progetto di esempio mi chiedo se mi farò male a perdere alcune delle caratteristiche di una finestra normale (ridimensionamento, non modale, ecc.). Sto iniziando a pensare che potrebbe valere la pena di prendere in considerazione un progetto che non richiede affatto dialoghi complessi, e magari avere un'applicazione MDI. Cosa ne pensi? – Matt

0

Quello che manca è un controller che è responsabile per il flusso di lavoro del ViewModels. Il Controller crea ViewModels e passa i dati necessari tra i ViewModels.

Il progetto WPF Application Framework (WAF) contiene applicazioni di esempio che mostrano come questo potrebbe funzionare.

Problemi correlati