Я хотел бы иметь комбинированный список, который позволяет выбирать из списка значений, а также позволяет настраивать значение из набранного текста. Для удобства отображения элементы являются сложным типом (скажем, шаблон элемента в выпадающем списке отображает цветовой патч и флаг, указывающий, является ли он пользовательским цветом).
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); }
}
Примеры элементов
var items = new [] {
new ColorLevel { Intensity = 0.9m, IsCustom = false, BaseColor = Color.Red },
new ColorLevel { Intensity = 0.7m, IsCustom = false, BaseColor = Color.Red }
}
1007 * XAML *
<ComboBox SelectedItem="{Binding Path=SelectedColorLevel}"
IsEditable="true" IsTextSearchEnabled="true">
</ComboBox>
Таким образом, приведенная выше разметка работает, когда элемент выбран из списка элементов. И когда вы набираете текстовым поиском, выбираются подходящие элементы. Если напечатанный текст не соответствует элементу, то для SelectedColorLevel устанавливается значение NULL.
Вопрос в том, в какой момент (и как) лучше всего создать новый пользовательский элемент, для которого можно установить значение SelectedColorLevel, если набранный текст не соответствует элементу.
Например, я бы хотел назначить новый элемент для выбранного значения, например
new ColorLevel { Intensity = decimal.Parse(textvalue), IsCustom = true }
или с помощью соответствующего конвертера и привязки данных к свойству Text.