我有一个组合框,它与一个可观察到的字符串集相连。 问题是,当组合框中实际选择的字符串发生变化时,组合框会丢失选择。
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
我认为这是因为字符串是不可变的并且创建了一个新的字符串对象 如何在不丢失选择的情况下更改字符串?
答案 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而言)