2012-11-24 8 views
7

Se TL; DR: vedere l'ultimo paragrafo.Separazione di viste, comando di presentazione (Testo, Icona) e logica di comando (Esegui, CanExecute)

Pure WPF "suggerisce" l'inserimento di presentazioni (controlli, testo, icone) in viste e la logica di comando (Esegui, metodi CanExecute) in code-behind. Oltre a mettere la logica in entrambe le viste (CommandBindings) e code-behind è una pratica disapprovata, non aiuta affatto con Duplicazione XAML: testo, icone, icone grandi, suggerimenti e numerose altre proprietà devono essere duplicate ogni volta che viene utilizzato il comando: per il menu principale, per il menu di scelta rapida, per il pulsante della barra degli strumenti, per il pulsante della barra multifunzione e altri controlli.

Sembra che il primo problema (veramente separando le viste e la logica) sia risolto da DelegateCommand, RelayCommand e approcci simili. La logica di comando viene spostata in ViewModels (o Controller in caso di MVVMC), code-behind è pulito, non CommandBindings e altre assurdità nelle visualizzazioni.

Tuttavia, non riesco a trovare una soluzione comunemente accettata per il problema della duplicazione della presentazione. Voglio separare la presentazione del comando (testo, icone) e la logica di comando (Execute, CanExecute). Tutto il codice che ho trovato può mettere la presentazione in codice (creando un RoutedCommand con proprietà aggiuntive come Label e Icon) o inserisce il codice nella presentazione (cioè, gestori in viste e code-behind). Neanche a me piace. Penso che la presentazione dovrebbe essere completamente in XAML e il codice dovrebbe essere completamente in CS (in ViewModel o Controller).

Domanda: come separare viste (XAML con controlli che i comandi di riferimento), la presentazione di comandi (etichette, icone ecc per ogni comando) e la logica di comandi (codice C# per Execute, CanExecute ecc in ViewModels o Controller)?

+0

Già due voti ravvicinati? E zero commenti? La domanda è inafferrabile o mi sono perso qualcosa? Se votate per chiudere, lasciate almeno un commento, per favore. Non posso imparare se non mi dici cosa ho fatto di sbagliato. – Athari

+0

Leggi la descrizione "non costruttiva" nelle FAQ - "questa domanda probabilmente solleciterà discussioni, discussioni, sondaggi o discussioni estese". Con lo stesso token, Stack Overflow non è un buon posto per chiedere "come devo costruire il mio software?" domande. –

+2

@JeanHominal Il modo in cui lo vedo, non ho chiesto come costruire il mio software, ho chiesto un problema che penso sia * molto comune *, considerando quanto codice ho visto dove questo problema non è risolto , anche nel codice di Microsoft. E a giudicare dai voti (5 +1 voti da 20 punti di vista), non sono l'unico a voler trovare una soluzione. – Athari

risposta

4

Non esiste una soluzione integrata a questo problema, si dovrà rimboccarsi le maniche e creare la struttura richiesta da soli.

In un recente progetto su cui ho lavorato, ho fatto esattamente questo. Ho creato un concetto chiamato "azione" che integra il WPF ICommand con altre proprietà visive. E 'stato qualcosa di simile ...

interface IAction 
{ 
    ICommand Command { get; } 
    string DisplayText { get; } 
    string ToolTipText{ get; } 
    URI Icon { get; } 
} 

L'applicazione contiene una raccolta di Action istanze. Questi potrebbero quindi essere associati a menu, barre degli strumenti, ecc. Consentendo di riutilizzare la stessa istanza Action con vari stili di presentazione diversi. È tutto roba MVVM abbastanza semplice!

Problemi correlati