MVVM. È un odore di codice quando il modello di vista ha proprietà con i nomi mostra / nascondi / mostra che appartengono semanticamente alla vista?

1

Recentemente sono stato coinvolto con WPF e ho esaminato MVVM. Capisco che il modello di vista non dovrebbe essere a conoscenza della vista.

Tuttavia, a volte mi imbatto in situazioni in cui il mio istinto iniziale è quello di scrivere proprietà nel modello di visualizzazione qualcosa come public bool ShowDialog { get; private set; } o public bool ShowPopUp { get; private set; }

Suggerisce che la responsabilità della vista stia strisciando nel modello della vista e dovrei avvicinarmi in modo diverso?

    
posta Siim Haas 16.02.2018 - 11:47
fonte

2 risposte

6

A volte questo può essere solo un problema di denominazione.

Ad esempio, chiamando qualcosa ShowDialog nel ViewModel quando ciò che intendi è AskTheUserForAFilePath , che è indipendente da come la Vista gestisce la richiesta. Allo stesso modo, ShowPopup quando intendi InformTheUserOfThisEvent .

Il risultato finale della comunicazione sarà lo stesso, ma consente a più viste di gestire la stessa interazione con ViewModel a modo loro.

    
risposta data 16.02.2018 - 12:14
fonte
3

Forse.

Se stavi facendo MVC direi di no. lo scopo del modello di vista è fornire un modello della vista che è possibile manipolare, interrogare e verificare nel codice. Non contiene alcuna logica di business. Ma può contenere la logica di visualizzazione. cioè quando questo è nascosto, mostra quello.

Potresti avere una mappatura uno a uno di View to ViewModel

In MVVM il modello di visualizzazione tende a contenere più logica aziendale. Dovresti essere in grado di applicare più viste a un singolo modello di visualizzazione e farle funzionare tutte. Una proprietà ShowDetail potrebbe non avere senso per alcune viste

Abbiamo quindi anche l'aspetto pratico di WPF. Dove Razor gestisce bene i binding complessi,

visiblity=@{..complex expression with multiple conditionals and function calls}

Wpf doesnt,

Visiblity="{Binding PropertyWhichIsTheCorrectType Converter={Static/Relative namespace:thingIDeclaredinXAMLEarlierMaybe}}"

Ti rende la vita molto più facile se puoi semplicemente aggiungere una proprietà alla tua VM e inserire la logica lì.

Hai anche controlli che non supportano pienamente il pattern MVVM, i Behaviors, i Converters e il code behind ecc. Tutto ciò può rendere il tuo codice disordinato se non hai un approccio comune che riutilizzi attraverso il tuo codebase.

In conclusione penso che le proprietà ShowDialogue non siano il modo peggiore per codificare. È meglio orientarsi verso un approccio MVC + VM-C più che cercare di forzare WPF in un modello MVVM purista

    
risposta data 16.02.2018 - 12:05
fonte

Leggi altre domande sui tag