Sto utilizzando un'applicazione standard wpf/mvvm in cui associo le caselle combinate alle raccolte su un ViewModel.Deseleziona ComboBoxItems in MVVM
Devo essere in grado di deselezionare un elemento dal menu a discesa. Significa che gli utenti dovrebbero essere in grado di selezionare qualcosa, e in seguito decidere di deselezionarlo (selezionarne uno). il problema è che non ci sono elementi vuoti nella mia collezione rilegata
il mio pensiero iniziale era semplicemente quello di inserire un nuovo oggetto nella collezione che risultasse avere un oggetto vuoto sopra la collezione.
questo è un trucco, e interessa tutto il codice che utilizza tale raccolta sul modello di visualizzazione.
per esempio se qualcuno è stato quello di scrivere
_myCollection.Frist(o => o.Name == "foo")
questo sarà un'eccezione di riferimento null.
possibile soluzione è:
_myCollection.Where(o => o != null).First(o => o.Name == "foo");
questo funzionerà, ma c'è modo di garantire eventuali futuri utilizzi di tale raccolta non causerà interruzioni.
qual è un buon schema/soluzione per poter aggiungere un elemento vuoto in modo che l'utente possa deselezionare. (Sono anche consapevole della struttura CollectionView, ma che sembra come un eccessivo per una cosa così semplice)
Aggiornamento
andò con @hbarck suggerimento e implementato CompositeCollection (Quick Proof of concept)
public CompositeCollection MyObjects {
get {
var col = new CompositeCollection();
var cc1 = new CollectionContainer();
cc1.Collection = _actualCollection;
var cc2 = new CollectionContainer();
cc2.Collection = new List<MyObject>() { null }; // PROBLEM
col.Add(cc2);
col.Add(cc1);
return col;
}
}
questo codice funziona con i collegamenti esistenti (incluso SelectedItem) che è ottimo.
Un problema con questo è, che se l'elemento è completamente null, il setter SelectedItem non viene mai chiamato selezionando.
Se modifico che una linea a questo:
cc2.Collection = new List<MyObject>() { new MyObject() }; // PROBLEM
il setter è chiamato, ma ora la mia voce selezionata è solo una classe base inizializzata invece di null .. Ho potuto aggiungere un po 'di codice nel setter per controlla/ripristina, ma non va bene.
si potrebbe consentire all'utente di de-selezionare una voce facendo clic su un MenuItem in un menu contestuale. –
clic destro sul menu a discesa? non è abbastanza intuitivo .. –
Potrei vivere con quello. ^^ Il Combobox non si apre nemmeno se si fa clic con il tasto destro su di esso, quindi non sarebbe ostile all'utente. –