Mi sono imbattuto in un disaccordo con un mio collega sull'implementazione di rappresentare un valore booleano in un ComboBox usando Xaml e MVVM. Attualmente, il mio viewmodel è molto semplice. Ho un bool?
che mi dice se alcune impostazioni sono abilitate, ed è nullable che viene usato come metodo per marcare il valore come "ereditato" dall'alto.
public class SomeViewModel : ViewModelBase
{
// Simplified -- Really implements INPC
public bool? IsSettingEnabled { get; set; }
}
Attualmente, il nostro Xaml è semplice. Abbiamo una casella di controllo TriState, tuttavia questo non è il modo più user-friendly per trasmettere i significati completi. Invece, vogliamo mostrare un ComboBox con i valori { { "Inherited", null }, { "Yes", true }, { "No", false } }
. Questo sembra funzionare molto bene:
<ComboBox ItemsSource="{Binding Path=BooleanOptions, Mode=OneTime}"
SelectedValue="{Binding Path=IsSettingEnabled}"
SelectedValuePath="Value"
DisplayMemberPath="Key" />
Il disaccordo che stiamo avendo è dove dovrebbe venire la proprietà BooleanOptions
? Siamo d'accordo che dovrebbe essere un IReadOnlyDictionary<string, bool?>
, ma se rispettiamo un pattern strict mvvm , allora la proprietà dovrebbe far parte del viewmodel o dovrebbe far parte del code-behind della vista?
Caveat: mi rendo conto che se è parte del codice della vista, il binding deve essere regolato in modo da puntare alla vista come DataContext: ItemsSource="{Binding Path=BooleanOptions, Mode=OneTime, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Control}}}"
.