Выбор поля со списком, привязанного к наблюдаемой коллекции строк, теряется после смены строк. - PullRequest
0 голосов
/ 02 мая 2011

У меня есть выпадающий список, который связан с наблюдаемой коллекцией строк. Проблема в том, что когда строка, которая фактически выбрана в комбинированном списке, изменяется, комбинированный список теряет выделение.

ObservableCollection<string> myList = new ObservableCollection<string>();
myList.Add("A");
myList.Add("B");
myComboBox.ItemsSource = myList;
...
myList[0] = "C"; //<-- if selected item of combobox was myList[0], selection becomes null

Я думаю, что это так, потому что строки неизменны, и был создан новый строковый объект.
Как я могу изменить строки без потери выбора?

1 Ответ

3 голосов
/ 02 мая 2011

Вы можете обернуть значение строки, но могут быть и лучшие методы.

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)

...