Abbiamo un sacco di oggetti valore immutabili nel nostro modello di dominio, un esempio di questo è una posizione, definita da una latitudine, longitudine & altezza.Come posso modificare oggetti immutabili in WPF senza duplicare il codice?
/// <remarks>When I grow up I want to be an F# record.</remarks>
public class Position
{
public double Latitude
{
get;
private set;
}
// snip
public Position(double latitude, double longitude, double height)
{
Latitude = latitude;
// snip
}
}
Il modo ovvio per consentire la modifica di una posizione è quello di costruire una ViewModel che ha getter e incastonatori, nonché un metodo ToPosition() per estrarre l'istanza posizione immutabile convalidato. Mentre questa soluzione sarebbe ok, risulterebbe in un sacco di codice duplicato, specialmente XAML.
Gli oggetti valore in questione sono composti da tre a cinque proprietà, che di solito sono alcune varianti di X, Y, Z & alcune cose ausiliarie. Detto questo, avevo preso in considerazione la creazione di tre ViewModels per gestire le varie possibilità, in cui ciascun ViewModel avrebbe bisogno di esporre le proprietà per il valore di ogni proprietà e una descrizione da visualizzare per ogni etichetta (ad esempio "Latitude").
Andando oltre, sembra che potrei semplificarlo con un ViewModel generale che può gestire le proprietà N e collegare tutto usando la riflessione. Qualcosa come una griglia di proprietà, ma per oggetti immutabili. Un problema con una griglia proprietà è che voglio essere in grado di cambiare l'aspetto in modo da poter avere etichette e caselle di testo come ad esempio:
Latitude: [ 32 ] <- TextBox
Longitude: [ 115 ]
Height: [ 12 ]
o metterlo in un DataGrid come ad esempio:
Latitude | Longitude | Height
32 115 12
Quindi la mia domanda è:
si può pensare a un modo elegante per risolvere questo problema? Ci sono librerie che fanno questo o articoli su qualcosa di simile?
Sono soprattutto alla ricerca di:
- duplicazione del codice da minimizzare
- Facile aggiungere nuovi tipi di oggetto valore
- possibile estendere con qualche tipo di convalida
Questa è una bella soluzione, la preferisco a quella di Paul perché c'è meno spazio. Naturalmente, si potrebbe effettivamente utilizzare la riflessione nella sua soluzione per ridurre il sovraccarico del programmatore di mappare le proprietà al dizionario. In realtà non c'è una risposta accettata perché ho risolto il problema in un altro modo e non avevo notato la risposta di Paolo 6 mesi circa dopo che avevo posto la domanda. Se dovessi offrire uno snippet di codice utilizzabile che le persone potrebbero usare, contrassegnerò questa come risposta accettata. –