tags:

views:

28

answers:

1

Well im trying to create a custom container class that contains in my case ViewMappingEntry's, so i created a class that inherits Freezable and implements ICollection.. but when creating an instance in Blend and browsing it i get this error: Cannot add content to an object of type 'ViewModelMapping'..

Note: It compiles fine and i get no error in Visual studio, so what am i missing?

public class ViewModelMapping : Freezable, ICollection<MappingEntry>
{
    object locker = new object();

    List<MappingEntry> internalList = new List<MappingEntry>();

    #region ICollection<MappingEntry> Members

    public void Add(MappingEntry item)
    {
        if (this.IsFrozen || this.IsSealed)
            throw new InvalidOperationException("ViewModelMapping is frozen");
        lock (locker)
            internalList.Add(item);
    }

    public void Clear()
    {
        if (this.IsFrozen || this.IsSealed)
            throw new InvalidOperationException("ViewModelMapping is frozen");
        lock (locker)
            internalList.Clear();
    }

    public bool Contains(MappingEntry item)
    {
        lock (locker)
            return internalList.Contains(item);
    }

    public void CopyTo(MappingEntry[] array, int arrayIndex)
    {
        lock (locker)
            internalList.CopyTo(array, arrayIndex);
    }

    public int Count
    {
        get 
        {
            lock (locker)
                return internalList.Count;
        }
    }

    public bool IsReadOnly
    {
        get { return base.IsFrozen || base.IsSealed; }
    }

    public bool Remove(MappingEntry item)
    {
        if (this.IsFrozen || this.IsSealed)
            throw new InvalidOperationException("ViewModelMapping is frozen");
        lock (locker)
            return internalList.Remove(item);
    }

    #endregion

    #region IEnumerable<MappingEntry> Members

    public IEnumerator<MappingEntry> GetEnumerator()
    {
        lock (locker)
            return (IEnumerator<MappingEntry>)internalList.ToArray().GetEnumerator();
    }

    #endregion

    #region IEnumerable Members

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        lock (locker)
            return internalList.ToArray().GetEnumerator();
    }

    #endregion

    protected override Freezable CreateInstanceCore()
    {
        ViewModelMapping viewModelMapping = new ViewModelMapping();
        lock(locker)
            viewModelMapping.internalList = new List<MappingEntry>(this.internalList.ToArray());

        return viewModelMapping;
    }
}
A: 

after trying around i found a solution if i implemented all these interfaces -> ICollection, IList, IList, ICollection, IEnumerable it started working in blend.

Petoj