IReadOnlyCollection with notifications It is not related to GUI. I have a class with:


Private List, which is edited inside the class.  
Open IReadOnlyCollection property for access to private List
Public event for notification on List changing


A list stores objects with properties. The class can changed an item's properties and notify about it. The user can only read an item's properties. I only picked this option.

class MortarInfo
{
    public double Angle { get; private set; }
    public bool State { get; private set; }
    public MortarInfo(double angle, bool state)
    {
        Angle = angle;
        State = state;
    }
}
class Mortars
{
    private List&lt;MortarInfo&gt; _mortarsInfo;
    private ReadOnlyCollection&lt;MortarInfo&gt; _readOnlyMortarsInfo;

    public Mortars()
    {
        _mortarsInfo = new List&lt;MortarInfo&gt;();
        _readOnlyMortarsInfo = _mortarsInfo.AsReadOnly();
    }

    public ReadOnlyCollection&lt;MortarInfo&gt; MortarsInfo
    {
        get { return _readOnlyMortarsInfo; }
    }
    public event ListChangedEventHandler MortarsInfoChanged;

    public void UpdateAngle(int index, double newAngle)
    {
        if (_mortarsInfo[index].Angle != newAngle)
        {
            _mortarsInfo[index] = new MortarInfo(newAngle, _mortarsInfo[index].State);
            if (MortarsInfoChanged != null)
            {
                var arg = new ListChangedEventArgs(ListChangedType.ItemChanged, index);
                MortarsInfoChanged(this, arg);
            }
        }
    }
}
It seems good but I have some comments on this,


Why do you create a new ListItem in every property change and not just replace to old property with the new one?

_list[index].Property1 = property1;

You raise the event without null check. Do this:

var listChanged = ListChanged;
if (listChanged != null)
    listChanged(this,new ListChangedEventArgs(ListChangedType.ItemChanged, index));

As a side note, if Property1 or Property2 are complex objects, It's recommended to create for them you own equal methods (Equal, GetHashCode, == and !=). If the are generic, implement IEquatable&lt;T&gt;