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