2011-05-02 60 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

相關問題