views:

402

answers:

1

I would like to have a combobox that allows selection from a list of values and also allow a custom value from the typed in text. For display reasons the items are a complex type (lets say the combobox item template displays a patch of color and a flag indicating if it is a custom color).

public class ColorLevel
{
    public decimal Intensity { get; set; }
    public bool IsCustom { get; set; }
    public Color BaseColor { get; set; }
    public override ToString() { return string.Format("{0}", Intensity*100); }
}

Example items

var items = new [] { 
    new ColorLevel { Intensity = 0.9m, IsCustom = false, BaseColor = Color.Red },
    new ColorLevel { Intensity = 0.7m, IsCustom = false, BaseColor = Color.Red }
}

XAML

<ComboBox SelectedItem="{Binding Path=SelectedColorLevel}"
          IsEditable="true" IsTextSearchEnabled="true">
</ComboBox>

So the above markup works when an item is selected from the item list. And as you type with the text search the matching items are selected. If the typed text doesn't match an item then the SelectedColorLevel is set to null.

The question is at what point (and how) is it best to create a new custom item that can be set to the SelectedColorLevel when the typed text doesn't match an item.

For example I would want to assign a new item to the selected value such as

new ColorLevel { Intensity = decimal.Parse(textvalue), IsCustom = true }

or using an appropriate converter and databinding to the Text property.

A: 

Not sure if i fully understood.. You could use the KeyDown event to add a new ColorLevel, for example when Return is pressed. If items is an ObservableCollection and you set it as the ComboBox's ItemsSource, the new ColorLevel added to items should be available in the list and become the SelectedItem.

Natxo