1

一个 ObservableCollection

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

public ObservableCollection<string> Items { get { return _items; } }

在用户交互(文本框事件)时更新。

在 ListBox 中,我将显示当前值

Binding listBinding = new Binding {Source = Items};
listbox.SetBinding(ListBox.ItemsSourceProperty, listBinding);

到目前为止有效:添加新值时,列表会立即更新。

但现在我必须要求:

  • 对值进行排序
  • 在列表开头添加一项

我解决如下:

public IEnumerable<string> ItemsExtended
{
  get
  {
    return new[] { "first value" }.Concat(Items.OrderBy(x => x));
  }
}

我将绑定更改为该 IEnumerable,并且该列表包含一个排序列表,其中“第一个值”位于位置一。

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

return new ObservableCollection<string> (new[] { "bla" }.Concat(_items.OrderBy(x => x)));

_items 更改时如何更新列表?

4

1 回答 1

1

从我头上掉下来。您可以为您的集合所属的类实现INotifyPropertyChanged 。之后为您的 _items 集合添加一个CollectionChanged处理程序并在该处理程序中触发 PropertyChanged("ItemsExtended")。同样在 getter 中使用yield return将避免创建一个新集合只是为了在顶部添加项目。

它应该看起来像这样

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));
    }
}
于 2012-07-11T11:28:22.533 回答