Sto usando .NET con Windows Form, ma credo che possano esserci problemi simili con altri toolkit.
Supponiamo di avere una lista di oggetti di un certo tipo. Usando un esempio per rendere più leggibile quanto segue, supponiamo che esista una classe Category
per rappresentarli. Visualizziamo un elenco di essi per consentire a un utente di filtrare gli articoli per categoria. Associare il componente ListBox a un'origine dati di Category
oggetti è un modo per farlo.
Quale sarebbe il modo migliore per aggiungere una voce denominata "Tutto" nello stesso ListBox? Supponiamo che debba essere incluso nell'elenco e non come un'opzione separata come un pulsante di opzione.
Posso pensare ai seguenti approcci, ma tutti sembrano avere uno svantaggio.
- Crea un'istanza di "fittizio"
Category
di nome "Tutto" e un ID non valido.
Questo è il modo più semplice ma si sente in modo errato concettualmente, poiché "Tutto" non è in realtà una categoria (nessun articolo appartiene a una categoria chiamata così). Inoltre, a seconda del framework, l'interfaccia utente potrebbe non essere in grado di creare oggetti Category
.
- Non utilizzare affatto l'associazione dati; compilare la casella di riepilogo con le stringhe e utilizzare l'indice della selezione per ottenere l'oggetto dall'origine dati.
Questo può battere il punto di avere i controlli associati ai dati e aggiunge potenziali problemi: cosa succede se vogliamo anche aggiungere una voce "None" in futuro? Dovremo incrementare l'indice selezionato della casella di riepilogo di 2 anziché 1 per ottenere l'oggetto corretto dall'origine dati.
- Utilizza una classe intermedia,
CategoryListItem
, per compilare la casella di riepilogo. Ha un riferimento / puntatore a unCategory
che ènull
per le entrate fittizie.
Questo può essere più elegante, ma aggiunge il sovraccarico di creare un nuovo elenco di istanze di CategoryListItem
per ogni elenco di istanze di Category
che vogliamo visualizzare.
Uno dei metodi sopra riportati è consigliato per legare i dati a un componente di questo tipo o forse a un modo a cui non avevo pensato?