2011-05-02 57 views
0

我有一个绑定到可观察的字符串集合的组合框。 问题是,当实际在组合框中选择的字符串发生更改时,组合框会丢失选择内容。更改字符串后,绑定到observablecollection的组合框的选择会丢失

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 

我认为这是因为字符串是不可变的,并且创建了一个新的字符串对象。
如何在不丢失选择的情况下更改字符串?

回答

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

另请注意,使用字符串集合的控件与选择总是有问题,因为如果有重复的值相同的对象将被引用,选择将去干草线(虽然ListBoxes比ComboBoxes更多)

+0

我也想到了这样的解决方案,但我希望会有更好的。但是,感谢这个解决方案。在其他情况下,该课程似乎也很有帮助。 – SpeziFish 2011-05-02 08:42:32

+0

刚刚添加了一个注释,为什么使用字符串集合不是一个好主意,即使这种未选择没有发生。 – 2011-05-02 08:43:56

+0

我添加了ToString() - 覆盖你的代码并试用了它。但是现在组合框不再更新这些值了!? – SpeziFish 2011-05-02 09:16:16

相关问题