2009-09-04 20 views
6

Desidero avere un oggetto vuoto nel comboBox per consentire all'utente di "Deseleziona" e mantenere la casella combinata vuota (valore Null).WPF: Nullable ComboBox

Come posso farlo?

+0

Leggi il mio blog per un esempio completamente funzionante di una combobox nullable pulita, vedi http://www.blueedge.nl/weblog/post/Nullable-ComboBox-in-Silverlight.aspx Le soluzioni supportano l'associazione dati bidirezionale con nullable elementi. –

risposta

3

Rendi la tua vita più semplice utilizzando un valore sentinella. Ovvero, un'istanza della classe del modello di visualizzazione che non rappresenta nulla.

+0

Non è esattamente quello che sto cercando. Voglio che l'elemento selezionato sia 'Null', non un'istanza come qualsiasi altro elemento della combobox. – Yannic

0

Se dai un'occhiata al mio blog here, puoi vedere una soluzione vincolante che non richiede di "modificare" la tua VM o di aggiungere elementi fittizi in una raccolta che non si adatta perfettamente ai tuoi dati .

In pratica, si utilizza un oggetto CompositeCollection in XAML, che consente ad esempio (ad esempio) di avere valori numerici nella casella combinata e il testo "Selezionare ..." per designare il segnaposto, che non puoi farlo se sei vincolato interamente ai campi numerici del tuo modello e ti affidi a questo valore magico.

+2

Penso di non essere d'accordo con Pete, e non solo perché mi hai chiamato uno "sviluppatore professionista";) Questo è solo un modo di lavorare più che usare sentinelle semplici, e molte di queste inquinano la vista. Non fraintendermi, penso che sia certamente un'opzione valida. Ma credo di preferire la semplicità delle sentinelle. Inoltre, poiché una VM è un modello della vista, se la vista ha bisogno di qualcosa per rappresentare nulla, non penso che sia fuori luogo manifestarsi nella VM. Il mio 2p. –

+0

Supponiamo che tu abbia un elenco di Paesi, il tuo 'sentinella' deve essere un paese senza descrizione? Quindi stai inquinando il database. Forse non capisco qualcosa. – Yannic

+1

Se si sta utilizzando la VM da cui eseguire il bind, non è necessario inserire i dati nel database, è sufficiente aggiungerlo prima di impostare DataContext. Mentre capisco il punto di vista di Kent qui, non sono d'accordo con lui perché questo limita la sentinella a essere compatibile con il tipo di dati dei dati a cui sei vincolante. Supponiamo (come ho detto sopra) di voler visualizzare un elenco di numeri interi da cui l'utente può selezionare, ma si desidera visualizzare "Selezionare ..." per avvisare l'utente che è necessaria una selezione, è necessario modificare il interi alle stringhe. –