Я думал, что это будет тривиальная задача, но не все так просто. Дело в том, что пользователь может вставить элемент (ы) в ComboBox
двумя способами:
- Просто набрав текст
- Вставив данные из буфера обмена (с помощью кнопки).
Во-первых, у меня был такой метод расширения:
internal static IEnumerable<T> GetItems<T>(this ComboBox comboBox)
{
return comboBox.Items.Cast<T>();
}
И использование:
var items = comboBox.GetItems<string>();
Этот не работает для текста, введенного вручную, так как этот текст не принадлежит коллекции Items
- и поэтому я получаю пустой список. Одна хитрость, о которой я подумал, это вставить этот текст в коллекцию Items
перед возвратом:
internal static IEnumerable<T> GetItems<T>(this ComboBox comboBox)
{
if (!comboBox.HasItems)
{
comboBox.Items.Add(comboBox.Text);
}
return comboBox.Items.Cast<T>();
}
Но тогда возникает проблема: пользователь может набрать другой текст, и тогда у нас есть два элемента, потому что предыдущий текст был вставлен! Мы можем очистить Items
коллекций, прежде чем продолжить, но ... что если элементы были вставлены через буфер обмена? :) Таким образом, все вставленные элементы будут очищены? :)
Я что-то пропустил? Есть ли какое-то решение?