Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 更改字符串后,绑定到observablecollection的组合框的选择丢失_Wpf_String_Binding_Combobox - Fatal编程技术网

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