MVVM Modo corretto per passare da una vista all'altra occupando lo stesso ingombro sullo schermo

1

Un esempio è il passaggio della vista principale in base all'elemento selezionato in un menu hamburger . Inoltre a volte è solo una piccola parte della GUI che cambia in base allo stato dell'applicazione o in base all'interazione dell'utente con altre parti della GUI.

Nei giorni WebForms, abbiamo utilizzato per creare un controllo struttura a schede e nascondere le barre dei pulsanti di tabulazione e modificare la pagina di tabulazione corrente a livello di codice. Oppure impila le viste l'una sopra l'altra nella progettazione e in fase di esecuzione nascondi tutte tranne una.

In WPF e MVVM ho visto persone creare DataTemplate per ogni vista, collegarle a un modello di vista e passare cambiando l'oggetto associato in un tipo di vista diverso e quindi la vista cambia.

Posso capire perché è una buona idea per le visualizzazioni del menu degli hamburger, ma per alcuni altri casi, non esiste necessariamente un modello di visualizzazione per ciascuna vista. In tal caso, mi piacerebbe evitare di dover creare modelli di visualizzazione fittizi per ogni vista solo per poter passare da una posizione all'altra piuttosto che avere realmente diversi tipi di dati che ho bisogno di associare a ciascuna vista.

Ho ragione di essere preoccupato per questi dettagli di progettazione?

Qualcuno ha avuto la stessa situazione? In che modo hai ottenuto l'effetto di cambio di visualizzazione?

In generale, supponendo che non ci sia un diverso tipo di dati collegati a ciascuna delle viste da passare, è una pratica corretta creare modelli di visualizzazione solo per qualcosa che è puramente GUI? In altre parole, i modelli di vista sono più accoppiati ai dati e che tipo di dati sono disponibili o alla GUI e ai tipi di visualizzazione che dobbiamo coprire? E dovremmo scrivere il codice per modificare le viste su determinati trigger nel codice dietro nel caso in cui concordiamo che si tratta di una pura GUI e che i modelli di vista non devono essere coinvolti?

    
posta Bishoy 09.11.2017 - 05:01
fonte

2 risposte

1

In MVVM, ViewModel contiene lo stato dell'interfaccia utente. La vista è semplicemente un riflesso di quello stato. Questo riflesso dello stato si ottiene tramite associazione dati, convertitori, stili, ecc.

Penso che quello che vuoi sia una variabile di stato sul tuo ViewModel e avere visibilità dei vari bit UI legati a quello stato.

Innanzitutto, definisci uno stato enum e crea una proprietà sulla tua VM:

enum ViewState
{
    State1,
    State2
}

class MyVM
{
    public ViewState ViewState {get;set;}
}

Quindi, nella tua vista, puoi nascondere / mostrare elementi dell'interfaccia utente usando i trigger:

<StackPanel>
    <StackPanel.Style>
        <Style TargetType="StackPanel">
            <Setter Property="Visibility" Value="Collapsed" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=ViewState}" Value="{x:Static local:ViewState.State1}">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </StackPanel.Style>
</StackPanel>
    
risposta data 09.11.2017 - 14:22
fonte
1

is it a correct practice to create view models just for something that is purely GUI?

Sì, è corretto, poiché lo scopo principale di avere un ViewModel è rappresentare qualcosa nell'interfaccia utente. Inoltre, puoi testare queste modifiche nell'interfaccia utente testando le modifiche nei tuoi modelli di visualizzazione.

should we write the code for changing views on certain triggers in code behind in case we agreed that this is purely GUI and view models are not to be involved?

Se questi sono solo problemi di pura GUI, puoi scrivere questo trigger in code-behind, in XAML o utilizzare VisualStateManager. Penso che tutte queste opzioni rispondano alla tua preoccupazione. Ma non sarà possibile testare unitamente il flusso della GUI con queste opzioni IMO.

    
risposta data 09.11.2017 - 12:26
fonte

Leggi altre domande sui tag