更改字符串后,选择与字符串的observablecollection绑定的组合框会丢失

时间:2011-05-02 08:23:48

标签: wpf string binding combobox

我有一个组合框,它与一个可观察到的字符串集相连。 问题是,当组合框中实际选择的字符串发生变化时,组合框会丢失选择。

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 个答案:

答案 0 :(得分:3)

您可以包装字符串的值,但可能有更好的方法。

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";

另请注意,对于带有选择的控件使用字符串集合总是有问题的,因为如果存在重复值,则将引用相同的对象,并且选择将变为干线(对于ListBox而言,更多的是对于ComboBoxes而言)