C# 当ObservableCollection更改与中间层绑定时更新列表

C# 当ObservableCollection更改与中间层绑定时更新列表,c#,binding,listbox,ienumerable,observablecollection,C#,Binding,Listbox,Ienumerable,Observablecollection,可观察到的收集 private ObservableCollection<string> _items = new ObservableCollection<string>(); public ObservableCollection<string> Items { get { return _items; } } 到目前为止,这是有效的:添加新值时,列表会立即更新 但现在我必须满足以下要求: 排序值 在列表的开头添加一项 我的解决办法如下: publ

可观察到的收集

private ObservableCollection<string> _items = new ObservableCollection<string>();

public ObservableCollection<string> Items { get { return _items; } }
到目前为止,这是有效的:添加新值时,列表会立即更新

但现在我必须满足以下要求:

  • 排序值
  • 在列表的开头添加一项
我的解决办法如下:

public IEnumerable<string> ItemsExtended
{
  get
  {
    return new[] { "first value" }.Concat(Items.OrderBy(x => x));
  }
}
public IEnumerable items
{
得到
{
返回新的[]{“first value”}.Concat(Items.OrderBy(x=>x));
}
}
我将绑定更改为IEnumerable,该列表包含一个排序列表,在位置1处有“第一个值”

不幸的是,当列表应该在用户交互时更新时,它不再起作用。即使再次将IEnumerable更改为ObservableCollection并直接引用私有ObservableCollection也无法解决问题:

return new ObservableCollection<string> (new[] { "bla" }.Concat(_items.OrderBy(x => x)));
返回新的observeCollection(new[]{“bla”}.Concat(_items.OrderBy(x=>x));

当项目发生变化时,如何更新列表?

我想不起来了。您可以为集合所属的类实现。之后,为_items集合添加一个处理程序,并在该处理程序中激发PropertyChanged(“ItemsExtend”)。另外,在getter中使用将避免创建一个新集合,而只是在顶部添加项

应该是这样的

public partial class MyClass : INotifyPropertyChanged
{

    ObservableCollection<string> _items;
    public MyClass()
    {
        _items = new ObservableCollection<string>();
        _items.CollectionChanged += (s, e) => { OnPropertyChanged("Items"); };
    }

    public IEnumerable<string> Items 
    { 
        get 
        {
            yield return "first value";
            foreach (var item in _items.OrderBy(x=>x))
                yield return item;

        } 
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }
}
公共部分类MyClass:INotifyPropertyChanged
{
可观察到的收集项目;
公共MyClass()
{
_items=新的ObservableCollection();
_items.CollectionChanged+=(s,e)=>{OnPropertyChanged(“items”);};
}
公共数字项目
{ 
得到
{
收益率返回“第一值”;
foreach(变量项在_items.OrderBy(x=>x))中)
收益回报项目;
} 
}
公共事件属性更改事件处理程序属性更改;
私有void OnPropertyChanged(字符串属性)
{
if(PropertyChanged!=null)
PropertyChanged(此,新PropertyChangedEventArgs(property));
}
}

从我的头顶上。您可以为集合所属的类实现。之后,为_items集合添加一个处理程序,并在该处理程序中激发PropertyChanged(“ItemsExtend”)。另外,在getter中使用将避免创建一个新集合,而只是在顶部添加项

应该是这样的

public partial class MyClass : INotifyPropertyChanged
{

    ObservableCollection<string> _items;
    public MyClass()
    {
        _items = new ObservableCollection<string>();
        _items.CollectionChanged += (s, e) => { OnPropertyChanged("Items"); };
    }

    public IEnumerable<string> Items 
    { 
        get 
        {
            yield return "first value";
            foreach (var item in _items.OrderBy(x=>x))
                yield return item;

        } 
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }
}
公共部分类MyClass:INotifyPropertyChanged
{
可观察到的收集项目;
公共MyClass()
{
_items=新的ObservableCollection();
_items.CollectionChanged+=(s,e)=>{OnPropertyChanged(“items”);};
}
公共数字项目
{ 
得到
{
收益率返回“第一值”;
foreach(变量项在_items.OrderBy(x=>x))中)
收益回报项目;
} 
}
公共事件属性更改事件处理程序属性更改;
私有void OnPropertyChanged(字符串属性)
{
if(PropertyChanged!=null)
PropertyChanged(此,新PropertyChangedEventArgs(property));
}
}

听起来是个不错的主意,但工作不正常。无论如何,谢谢。听起来是个不错的主意,但工作不正常。无论如何,谢谢你。