我有一些对象的列表。如下所示:
public ObservableCollection<Property > Items { get; private set; }
现在,当客户询问项目 i 时,我需要发送项目 i+1 而不是 i。当列表填充时,我不可能更改排列。此外,当用户调用 Items 而不是 i 时,他们也不可能调用 i+1。
所以最好的方法是我覆盖get
这个属性的方法,而不是 i 索引中的对象返回 i+1 索引中的对象。可能吗?
我有一些对象的列表。如下所示:
public ObservableCollection<Property > Items { get; private set; }
现在,当客户询问项目 i 时,我需要发送项目 i+1 而不是 i。当列表填充时,我不可能更改排列。此外,当用户调用 Items 而不是 i 时,他们也不可能调用 i+1。
所以最好的方法是我覆盖get
这个属性的方法,而不是 i 索引中的对象返回 i+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
接口使用户能够订阅更改通知。