Wpf 更改字符串后,绑定到observablecollection的组合框的选择丢失
我有一个组合框,它绑定到一个可观察的字符串集合。 问题是,当组合框中实际选中的字符串被更改时,组合框将丢失选择Wpf 更改字符串后,绑定到observablecollection的组合框的选择丢失,wpf,string,binding,combobox,Wpf,String,Binding,Combobox,我有一个组合框,它绑定到一个可观察的字符串集合。 问题是,当组合框中实际选中的字符串被更改时,组合框将丢失选择 ObservableCollection<string> myList = new ObservableCollection<string>(); myList.Add("A"); myList.Add("B"); myComboBox.ItemsSource = myList; ... myList[0] = "C"; //<-- if selected
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
ObservableCollection myList=新的ObservableCollection();
myList.添加(“A”);
myList.添加(“B”);
myComboBox.ItemsSource=myList;
...
myList[0]=“C”// 您可以包装字符串的值,但可能有更好的方法
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;
}
还请注意,对具有选择的控件使用字符串集合总是有问题的,因为如果存在重复的值,则会引用同一对象,并且选择会出错(尽管列表框比组合框更容易出错)您可以包装字符串的值,但可能有更好的方法
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;
}
还请注意,对带有选择的控件使用字符串集合总是有问题的,因为如果存在重复的值,则会引用同一对象,并且选择会出错(尽管对于列表框来说要比组合框多得多)我也想到了这样的解决方案,但我希望会有更好的解决方案。但是谢谢你的解决方案。在其他情况下,该类似乎也非常有用。刚才添加了一个注释,说明了为什么即使未进行此取消选择,使用字符串集合也不是一个好主意。我在代码中添加了ToString()-覆盖,并进行了尝试。但是现在组合框不再更新值了!?使用ToString
显示某些内容不是正确的方法。由于没有实际的绑定,ToString
在值更改时不会再次调用,因此需要使用DataTemplate并绑定到Value
属性。我也想到了这样的解决方案,但我希望会有更好的解决方案。但是谢谢你的解决方案。在其他情况下,该类似乎也非常有用。刚才添加了一个注释,说明了为什么即使未进行此取消选择,使用字符串集合也不是一个好主意。我在代码中添加了ToString()-覆盖,并进行了尝试。但是现在组合框不再更新值了!?使用ToString
显示某些内容不是正确的方法。由于没有实际的绑定,因此当值更改时,将不会再次调用ToString
,因此需要使用DataTemplate并绑定到Value
属性。
myList[0].Value = "C";