Sto usando un ComboBox nella mia applicazione WPF e seguendo MVVM. C'è una lista di stringhe che voglio mostrare nel mio ComboBox.Ripristina combobox elemento selezionato sul set usando MVVM
XAML:
<ComboBox ItemsSource="{Binding ItemsCollection}" SelectedItem="{Binding SelectedItem}" />
Vista Modello:
public Collection<string> ItemsCollection; // Suppose this has 10 values.
private string _selectedItem;
public string SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
Trigger Notify of property changed.
}
}
Ora questo codice sta lavorando assolutamente bene. Sono in grado di selezionare dalla vista e posso ottenere modifiche in ViewModel e se cambio SelectedItem dal mio ViewModel posso vederlo nella mia vista.
Ora ecco quello che sto cercando di ottenere. Quando cambio la voce selezionata dalla mia vista, devo mettere un controllo sul fatto che il valore sia buono/cattivo (o qualsiasi altra cosa) imposta la voce selezionata altrimenti non la imposta. Quindi il mio modello di vista cambia in questo modo.
public string SelectedItem
{
get { return _selectedItem; }
set
{
if (SomeCondition(value))
_selectedItem = value; // Update selected item.
else
_selectedItem = _selectedItem; // Do not update selected item.
Trigger Notify of property changed.
}
}
Ora, quando eseguo questo codice e SomeCondition (valore) restituisce false, SelectedItem restituisce vecchio valore stringa, ma a mio avviso elemento selezionato nella ComboBox è il valore che ho selezionato. Quindi supponiamo di avere una collezione di 10 stringhe mostrate nel mio ComboBox. Tutti i valori sono validi tranne il secondo e il quarto elemento (SomeCondition restituisce false per il 2 ° e il 4 ° valore). Quello che voglio è che se seleziono il secondo o il quarto elemento selezionato, l'elemento non cambia. Ma il mio codice non lo fa correttamente. Se seleziono il secondo elemento, la visualizzazione mostra ancora il secondo elemento come selezionato. So che c'è qualcosa di sbagliato nel mio codice. Ma cos'è?
Questo non è un design molto intuitivo. Se seleziono qualcosa in una casella combinata, mi aspetto che sia il mio elemento selezionato. Devi invece rimuovere le opzioni non valide dalla casella combinata. Se una validità delle selezioni è basata su un valore selezionato di un altro elemento dell'interfaccia utente, la modifica di tale selezione dovrebbe attivare la ricostruzione di ItemSource della casella combinata. –
Questo è il requisito per mostrare tutti gli elementi, non è possibile cambiarlo. –
Accetto che non mostri opzioni non valide o che non li visualizzi in grigio e ne disabiliti la selezione, ovvero a cosa serve un'interfaccia utente. –