Вы можете обернуть значение строки, но могут быть и лучшие методы.
public class WrappedValue<T> : INotifyPropertyChanged where T : IEquatable<T>
{
private T _value;
public T Value
{
get { return _value; }
set
{
if (_value == null || !_value.Equals(value))
{
_value = value;
OnPropertyChanged("Value");
}
}
}
public WrappedValue() { }
public WrappedValue(T value)
{
Value = value;
}
public static implicit operator T(WrappedValue<T> a)
{
return a.Value;
}
public static implicit operator WrappedValue<T>(T a)
{
return new WrappedValue<T>(a);
}
private void OnPropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
Посредством неявных преобразований исходный код даже не сильно изменится:
ObservableCollection<WrappedValue<string>> myList = new ObservableCollection<WrappedValue<string>>();
myList.Add("A");
myList.Add("B");
myComboBox.ItemsSource = myList;
Но вы должны установить свойство Value, чтобы не заменять объект полностью, если вы его редактируете:
myList[0].Value = "C";
Также обратите внимание, что использование коллекций строк для элементов управления с выделением всегда проблематично, поскольку при наличии повторяющихся значений на один и тот же объект будет ссылаться, и выбор будет проходить без сбоев (хотя в ListBoxes это гораздо больше, чем в ComboBoxes)