2015-06-12 4 views
7

Ho un progetto WPF e devo creare un controllo specifico per il dominio ma verrà riutilizzato in più viste.Controlli WPF - Il codice deve essere evitato a tutti i costi?

Il controllo deve visualizzare un valore decimale in 3 parti, la parte integrale e la parte decimale divisi in 2 con dimensioni di carattere diverse. Ho una proprietà di dipendenza per l'importo e quindi divido l'importo in 3 parti nel codice sottostante in modo che possa mostrarle nelle etichette specifiche. Io uso anche la quantità decimale per decidere se la quantità è in aumento o in diminuzione e successivamente modificare il colore di sfondo del controllo. Tutto ciò è fatto nel codice sottostante. So che alcuni dicono che il codice dietro è malvagio e sono d'accordo nella maggior parte dei casi. Tuttavia, come lo implementeresti diversamente?

+0

'la parte decimale divisa in 2 con dimensioni di carattere diverse' - potresti spiegarci un po '? – goobering

+1

È un dettaglio e non fa davvero la differenza nella domanda. Immagina di dover visualizzare i primi 3 punti decimali nella parte anteriore 10 e il resto nel carattere 8. – Klaws86

risposta

12

No, non dovrebbe essere evitato a tutti i costi.

Ricorda, Dati sono dati, UI è UI.

Ad esempio, se si dispone di un codice che utilizza solo lo standard nell'interfaccia utente, non c'è nulla di male nell'avere il codice.

Tutto ciò che funziona con i dati effettivi, tra cui lavorare con il ViewModel deve essere generalmente evitato in code-behind, come si sarebbe poi essere la creazione di dipendenze, che pause il design pattern MVVM.

Quindi per rispondere alla tua domanda più direttamente, non c'è nulla di sbagliato in ciò che hai fatto.

EDIT

Mi spiego ulteriormente.

Immagine della scena, si dispone di una vista, con un pulsante che deve avviare un Storyboard quando è stato fatto clic. (Naturalmente, puoi farlo solo in XAML, ma questo è solo un esempio)

In questo caso, non c'è nulla di male nell'aggiungere un evento click al pulsante e avviare lo storyboard da code-behind. Questo è UI solo codice, quindi è sicuro.

Tuttavia, supponiamo che il pulsante debba modificare una proprietà nel tuo ViewModel quando viene fatto clic. Il numero non deve essere inserire il codice DataContext nel code-behind. È necessario utilizzare uno Command perché è necessario mantenere separato dal ViewModel.

C'è uno stigma che se le tue visualizzazioni hanno code-behind, allora dovresti essere tirato indietro e sparato nella parte posteriore della testa, stile di esecuzione. Questo non è vero.

Tutto ciò detto, MVVM è un modello , non la legge.

+0

concordato. Mi riservo le esecuzioni solo per coloro che scelgono di utilizzare Windows Form quando potrebbero preferire WPF. – Falanwe

+0

Sono d'accordo con questa filosofia al 100%. Tuttavia alcuni sostengono che tutto ciò che può essere fatto con il codice sottostante può essere fatto in XAML (come nell'esempio del tuo story board). C'è qualche costrutto XAML che può aiutare a fare quanto sopra? – Klaws86

+0

@ Klaws86 Non * tutto * ha una sola soluzione XAML, e sono abbastanza fiducioso nel dire che ciò che si richiede non ha una soluzione XAML. Il code-behind è lì per un motivo, mentre XAML è incredibilmente pro, a volte non è possibile raggiungerlo e ** non è una brutta cosa **. Aiutarti a creare un controllo che faccia ciò che richiedi va oltre lo scopo della tua domanda, sarebbe una buona idea porre una nuova domanda se sei bloccato. –

0

Invece di suddividere l'importo in 3 in Code Behind, è possibile mantenere una proprietà in ViewModel e utilizzare un convertitore con 3 parametri per estrarre una delle tre informazioni per Display.Così si può avere 3 attacchi come questo:

"{Binding Amount, Mode=TwoWay, Converter={StaticResource AmountSplitterConverter},ConverterParameter=Integral}" 

"{Binding Amount, Mode=TwoWay, Converter={StaticResource AmountSplitterConverter},ConverterParameter=Decimal1}" 

"{Binding Amount, Mode=TwoWay, Converter={StaticResource AmountSplitterConverter},ConverterParameter=Decimal2}" 

Fatemi sapere se avete bisogno di ulteriore aiuto nella sua attuazione, o se non è chiaro.

+0

Grazie a ciò, sfortunatamente ho bisogno del valore Amount e del valore precedente affinché sia ​​in grado di eseguire la logica font sul controllo, in modo da risolvere solo metà del problema. – Klaws86

Problemi correlati