G’day!
I want my WPF ComboBox to display some alternative text when its data-bound selection is null.
The view model has the expected properties:
public ThingoSelectionViewModel : INotifyPropertyChanged {
public ThingoSelectionViewModel(IProvideThingos) {
this.Thingos = IProvideThingos.GetThingos();
}
public ObservableCollection<Thingo> Thingos { get; set; }
public Thingo SelectedThingo {
get { return this.selectedThingo; }
set { // set this.selectedThingo and raise the property change notification
}
// ...
}
The view has XAML binding to the view model in the expected way:
<ComboBox x:Name="ComboboxDrive" SelectedItem="{Binding Path=SelectedThingo}"
IsEditable="false" HorizontalAlignment="Left" MinWidth="100"
IsReadOnly="false" Style="{StaticResource ComboboxStyle}"
Grid.Column="1" Grid.Row="1" Margin="5" SelectedIndex="0">
<ComboBox.ItemsSource>
<CompositeCollection>
<ComboBoxItem IsEnabled="False">Select a thingo</ComboBoxItem>
<CollectionContainer
Collection="{Binding Source={StaticResource Thingos}}" />
</CompositeCollection>
</ComboBox.ItemsSource>
</ComboBox>
The ComboBoxItem wedged into the top is a way to get an extra item at the top. It’s pure chrome: the view model stays pure and simple. There’s just one problem: the users want “Select a thingo” displayed whenever the ComboBox’ selection is null.
The users do not want a thingo selected by default. They want to see a message telling them to select a thingo.
I’d like to avoid having to pollute the viewmodel with a ThingoWrapper class with a ToString method returning “Select a thingo” if its .ActualThingo property is null, wrapping each Thingo as I populate Thingos, and figuring out some way to prevent the user from selecting the nulled Thingo.
Is there a way to display “Select a thingo” within the ComboBox‘ boundaries using pure XAML, or pure XAML and a few lines of code in the view’s code-behind class?
The path of least resistance here that I’ve found is to use the Null Object Pattern For an example of using this pattern in the .NET Framework, consider the static value Double.NaN if you create a Null Object for your Thingo, in your view model you can append it to the front of your list to signify “nothing is selected”. Create a DataTemplate for the Thingo class that has a DataTrigger for the Null Object instance that shows “Select a Value”.
I could give a code sample but it’s past my bed time.