0

我有一些对象的列表。如下所示:

public ObservableCollection<Property > Items { get; private set; }

现在,当客户询问项目 i 时,我需要发送项目 i+1 而不是 i。当列表填充时,我不可能更改排列。此外,当用户调用 Items 而不是 i 时,他们也不可能调用 i+1。

所以最好的方法是我覆盖get这个属性的方法,而不是 i 索引中的对象返回 i+1 索引中的对象。可能吗?

4

1 回答 1

1

如建议的那样,您可以根据索引创建自己的集合类型ObservableCollection<T>并相应地修改索引器。唯一的问题是您不能只覆盖索引器,因为它不是虚拟的,但是您可以将 an 包装ObservableCollection<T>到一个类中,将所有工作委托给它,但修改索引器实现以将一个添加到 getter 访问:

public class PlusOneObservableCollection<T> : IList<T>, INotifyCollectionChanged, INotifyPropertyChanged
{
    private ObservableCollection<T> innerCollection;

    public PlusOneObservableCollection()
    {
        this.innerCollection = new ObservableCollection<T>();
        this.innerCollection.CollectionChanged += InnerCollection_CollectionChanged;
    }
    public PlusOneObservableCollection(IEnumerable<T> collection)
    {
        this.innerCollection = new ObservableCollection<T>(collection);
        this.innerCollection.CollectionChanged += InnerCollection_CollectionChanged;
    }

    private void InnerCollection_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        NotifyCollectionChangedEventHandler handler = this.CollectionChanged;
        if (handler != null)
        {
            handler(this, e);
        }
    }

    public int IndexOf(T item)
    {
        return this.innerCollection.IndexOf(item);
    }

    public void Insert(int index, T item)
    {
        this.innerCollection.Insert(index, item);
    }

    public void RemoveAt(int index)
    {
        this.innerCollection.RemoveAt(index);
    }

    public T this[int index]
    {
        get
        {
            //Here is where the actual change takes place
            return this.innerCollection[index + 1];
        }
        set
        {
            this.innerCollection[index] = value;
        }
    }

    public void Add(T item)
    {
        this.innerCollection.Add(item);
    }

    public void Clear()
    {
        this.innerCollection.Clear();
    }

    public bool Contains(T item)
    {
        return this.innerCollection.Contains(item);
    }

    public void CopyTo(T[] array, int arrayIndex)
    {
        this.innerCollection.CopyTo(array, arrayIndex);
    }

    public int Count
    {
        get { return this.innerCollection.Count; }
    }

    public bool IsReadOnly
    {
        get { return false; }
    }

    public bool Remove(T item)
    {
        return this.innerCollection.Remove(item);
    }

    public IEnumerator<T> GetEnumerator()
    {
        return this.innerCollection.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.innerCollection.GetEnumerator();
    }

    public event NotifyCollectionChangedEventHandler CollectionChanged;
    public event PropertyChangedEventHandler PropertyChanged;
}

但是,使用这种方法,您将需要更改属性类型,因为它不再继承自ObservableCollection<T>,而是从IList<T>现在继承。然而,让它实现INotifyCollectionChanged接口使用户能够订阅更改通知。

于 2013-11-03T18:39:56.317 回答