Я не знаю, поможет ли это, но вот действительно простая реализация "наблюдаемого набора", который я сделал для личного проекта. По сути, он защищает от вставки (или перезаписи) элемента, который уже находится в коллекции.
Если вы хотите, вы можете просто вернуться из методов, а не выдавать исключение.
public class SetCollection<T> : ObservableCollection<T>
{
protected override void InsertItem(int index, T item)
{
if (Contains(item)) throw new ItemExistsException(item);
base.InsertItem(index, item);
}
protected override void SetItem(int index, T item)
{
int i = IndexOf(item);
if (i >= 0 && i != index) throw new ItemExistsException(item);
base.SetItem(index, item);
}
}