Index: trunk/sources/HeuristicLab.Collections/3.3/IObservableArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/IObservableArray.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/IObservableArray.cs	(revision 3317)
@@ -20,4 +20,5 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.ComponentModel;
@@ -25,5 +26,8 @@
 namespace HeuristicLab.Collections {
   public interface IObservableArray<T> : IList<T>, INotifyObservableArrayItemsChanged<T>, INotifyPropertyChanged {
+    bool ReadOnlyView { get; set; }
     int Length { get; }
+
+    event EventHandler ReadOnlyViewChanged;
   }
 }
Index: trunk/sources/HeuristicLab.Collections/3.3/IObservableCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/IObservableCollection.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/IObservableCollection.cs	(revision 3317)
@@ -20,8 +20,13 @@
 #endregion
 
+using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 
 namespace HeuristicLab.Collections {
-  public interface IObservableCollection<T> : ICollection<T>, INotifyObservableCollectionItemsChanged<T>, INotifyPropertyChanged { }
+  public interface IObservableCollection<T> : ICollection<T>, INotifyObservableCollectionItemsChanged<T>, INotifyPropertyChanged {
+    bool ReadOnlyView { get; set; }
+
+    event EventHandler ReadOnlyViewChanged;
+  }
 }
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableArray.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableArray.cs	(revision 3317)
@@ -35,4 +35,17 @@
 
     #region Properties
+    [Storable]
+    private bool readOnlyView;
+    public bool ReadOnlyView {
+      get { return readOnlyView; }
+      set {
+        if (readOnlyView != value) {
+          readOnlyView = value;
+          OnReadOnlyViewChanged();
+          OnPropertyChanged("ReadOnlyView");
+        }
+      }
+    }
+
     public int Length {
       get { return array.Length; }
@@ -63,13 +76,17 @@
     public ObservableArray() {
       array = new T[0];
+      readOnlyView = array.IsReadOnly;
     }
     public ObservableArray(int length) {
       array = new T[length];
+      readOnlyView = array.IsReadOnly;
     }
     public ObservableArray(T[] array) {
       this.array = (T[])array.Clone();
+      readOnlyView = array.IsReadOnly;
     }
     public ObservableArray(IEnumerable<T> collection) {
       array = collection.ToArray();
+      readOnlyView = array.IsReadOnly;
     }
     #endregion
@@ -281,8 +298,15 @@
     #region Events
     [field: NonSerialized]
+    public event EventHandler ReadOnlyViewChanged;
+    protected virtual void OnReadOnlyViewChanged() {
+      EventHandler handler = ReadOnlyViewChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -290,6 +314,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsMoved;
     protected virtual void OnItemsMoved(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsMoved != null)
-        ItemsMoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsMoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -297,6 +321,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -304,6 +328,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableCollection.cs	(revision 3317)
@@ -34,4 +34,17 @@
 
     #region Properties
+    [Storable]
+    private bool readOnlyView;
+    public bool ReadOnlyView {
+      get { return readOnlyView; }
+      set {
+        if (readOnlyView != value) {
+          readOnlyView = value;
+          OnReadOnlyViewChanged();
+          OnPropertyChanged("ReadOnlyView");
+        }
+      }
+    }
+
     public int Capacity {
       get { return list.Capacity; }
@@ -54,10 +67,13 @@
     public ObservableCollection() {
       list = new List<T>();
+      readOnlyView = ((ICollection<T>)list).IsReadOnly;
     }
     public ObservableCollection(int capacity) {
       list = new List<T>(capacity);
+      readOnlyView = ((ICollection<T>)list).IsReadOnly;
     }
     public ObservableCollection(IEnumerable<T> collection) {
       list = new List<T>(collection);
+      readOnlyView = ((ICollection<T>)list).IsReadOnly;
     }
     #endregion
@@ -189,8 +205,15 @@
     #region Events
     [field: NonSerialized]
+    public event EventHandler ReadOnlyViewChanged;
+    protected virtual void OnReadOnlyViewChanged() {
+      EventHandler handler = ReadOnlyViewChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<T> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<T> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -198,6 +221,6 @@
     public event CollectionItemsChangedEventHandler<T> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<T> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -205,6 +228,6 @@
     public event CollectionItemsChangedEventHandler<T> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
+      CollectionItemsChangedEventHandler<T> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
     }
 
@@ -212,6 +235,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableDictionary.cs	(revision 3317)
@@ -35,4 +35,17 @@
 
     #region Properties
+    [Storable]
+    private bool readOnlyView;
+    public bool ReadOnlyView {
+      get { return readOnlyView; }
+      set {
+        if (readOnlyView != value) {
+          readOnlyView = value;
+          OnReadOnlyViewChanged();
+          OnPropertyChanged("ReadOnlyView");
+        }
+      }
+    }
+
     public ICollection<TKey> Keys {
       get { return dict.Keys; }
@@ -71,19 +84,25 @@
     public ObservableDictionary() {
       dict = new Dictionary<TKey, TValue>();
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TValue>>)dict).IsReadOnly;
     }
     public ObservableDictionary(int capacity) {
       dict = new Dictionary<TKey, TValue>(capacity);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TValue>>)dict).IsReadOnly;
     }
     public ObservableDictionary(IEqualityComparer<TKey> comparer) {
       dict = new Dictionary<TKey, TValue>(comparer);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TValue>>)dict).IsReadOnly;
     }
     public ObservableDictionary(IDictionary<TKey, TValue> dictionary) {
       dict = new Dictionary<TKey, TValue>(dictionary);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TValue>>)dict).IsReadOnly;
     }
     public ObservableDictionary(int capacity, IEqualityComparer<TKey> comparer) {
       dict = new Dictionary<TKey, TValue>(capacity, comparer);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TValue>>)dict).IsReadOnly;
     }
     public ObservableDictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer) {
       dict = new Dictionary<TKey, TValue>(dictionary, comparer);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TValue>>)dict).IsReadOnly;
     }
     #endregion
@@ -181,8 +200,15 @@
     #region Events
     [field: NonSerialized]
+    public event EventHandler ReadOnlyViewChanged;
+    protected virtual void OnReadOnlyViewChanged() {
+      EventHandler handler = ReadOnlyViewChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<KeyValuePair<TKey, TValue>> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
     }
 
@@ -190,6 +216,6 @@
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<KeyValuePair<TKey, TValue>> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
     }
 
@@ -197,6 +223,6 @@
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<KeyValuePair<TKey, TValue>> items, IEnumerable<KeyValuePair<TKey, TValue>> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
     }
 
@@ -204,6 +230,6 @@
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<KeyValuePair<TKey, TValue>> items, IEnumerable<KeyValuePair<TKey, TValue>> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
     }
 
@@ -211,6 +237,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollection.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableKeyedCollection.cs	(revision 3317)
@@ -35,4 +35,17 @@
 
     #region Properties
+    [Storable]
+    private bool readOnlyView;
+    public bool ReadOnlyView {
+      get { return readOnlyView; }
+      set {
+        if (readOnlyView != value) {
+          readOnlyView = value;
+          OnReadOnlyViewChanged();
+          OnPropertyChanged("ReadOnlyView");
+        }
+      }
+    }
+
     public int Count {
       get { return dict.Count; }
@@ -55,10 +68,13 @@
     protected ObservableKeyedCollection() {
       dict = new Dictionary<TKey, TItem>();
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TItem>>)dict).IsReadOnly;
     }
     protected ObservableKeyedCollection(int capacity) {
       dict = new Dictionary<TKey, TItem>(capacity);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TItem>>)dict).IsReadOnly;
     }
     protected ObservableKeyedCollection(IEqualityComparer<TKey> comparer) {
       dict = new Dictionary<TKey, TItem>(comparer);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TItem>>)dict).IsReadOnly;
     }
     protected ObservableKeyedCollection(IEnumerable<TItem> collection) {
@@ -67,7 +83,9 @@
       foreach (TItem item in collection)
         dict.Add(GetKeyForItem(item), item);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TItem>>)dict).IsReadOnly;
     }
     protected ObservableKeyedCollection(int capacity, IEqualityComparer<TKey> comparer) {
       dict = new Dictionary<TKey, TItem>(capacity, comparer);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TItem>>)dict).IsReadOnly;
     }
     protected ObservableKeyedCollection(IEnumerable<TItem> collection, IEqualityComparer<TKey> comparer) {
@@ -76,4 +94,5 @@
       foreach (TItem item in collection)
         dict.Add(GetKeyForItem(item), item);
+      readOnlyView = ((ICollection<KeyValuePair<TKey, TItem>>)dict).IsReadOnly;
     }
     #endregion
@@ -250,8 +269,15 @@
     #region Events
     [field: NonSerialized]
+    public event EventHandler ReadOnlyViewChanged;
+    protected virtual void OnReadOnlyViewChanged() {
+      EventHandler handler = ReadOnlyViewChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<TItem> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<TItem> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<TItem>(items));
+      CollectionItemsChangedEventHandler<TItem> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items));
     }
 
@@ -259,6 +285,6 @@
     public event CollectionItemsChangedEventHandler<TItem> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<TItem> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<TItem>(items));
+      CollectionItemsChangedEventHandler<TItem> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items));
     }
 
@@ -266,6 +292,6 @@
     public event CollectionItemsChangedEventHandler<TItem> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<TItem> items, IEnumerable<TItem> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
+      CollectionItemsChangedEventHandler<TItem> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
     }
 
@@ -273,6 +299,6 @@
     public event CollectionItemsChangedEventHandler<TItem> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<TItem> items, IEnumerable<TItem> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
+      CollectionItemsChangedEventHandler<TItem> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
     }
 
@@ -280,6 +306,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableList.cs	(revision 3317)
@@ -34,4 +34,17 @@
 
     #region Properties
+    [Storable]
+    private bool readOnlyView;
+    public bool ReadOnlyView {
+      get { return readOnlyView; }
+      set {
+        if (readOnlyView != value) {
+          readOnlyView = value;
+          OnReadOnlyViewChanged();
+          OnPropertyChanged("ReadOnlyView");
+        }
+      }
+    }
+
     public int Capacity {
       get { return list.Capacity; }
@@ -68,10 +81,13 @@
     public ObservableList() {
       list = new List<T>();
+      readOnlyView = ((ICollection<T>)list).IsReadOnly;
     }
     public ObservableList(int capacity) {
       list = new List<T>(capacity);
+      readOnlyView = ((ICollection<T>)list).IsReadOnly;
     }
     public ObservableList(IEnumerable<T> collection) {
       list = new List<T>(collection);
+      readOnlyView = ((ICollection<T>)list).IsReadOnly;
     }
     #endregion
@@ -375,8 +391,15 @@
     #region Events
     [field: NonSerialized]
+    public event EventHandler ReadOnlyViewChanged;
+    protected virtual void OnReadOnlyViewChanged() {
+      EventHandler handler = ReadOnlyViewChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<IndexedItem<T>> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
     }
 
@@ -388,6 +411,6 @@
     }
     private void OnItemsAdded(IEnumerable<T> items) {
-      if (itemsAdded != null)
-        itemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = itemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -395,6 +418,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<IndexedItem<T>> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
     }
 
@@ -406,6 +429,6 @@
     }
     private void OnItemsRemoved(IEnumerable<T> items) {
-      if (itemsRemoved != null)
-        itemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = itemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -413,6 +436,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -420,6 +443,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsMoved;
     protected virtual void OnItemsMoved(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsMoved != null)
-        ItemsMoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsMoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -427,6 +450,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -438,6 +461,6 @@
     }
     private void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (collectionReset != null)
-        collectionReset(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
+      CollectionItemsChangedEventHandler<T> handler = collectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
     }
 
@@ -445,6 +468,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ObservableSet.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ObservableSet.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/ObservableSet.cs	(revision 3317)
@@ -35,4 +35,17 @@
 
     #region Properties
+    [Storable]
+    private bool readOnlyView;
+    public bool ReadOnlyView {
+      get { return readOnlyView; }
+      set {
+        if (readOnlyView != value) {
+          readOnlyView = value;
+          OnReadOnlyViewChanged();
+          OnPropertyChanged("ReadOnlyView");
+        }
+      }
+    }
+
     public IEqualityComparer<T> Comparer {
       get { return set.Comparer; }
@@ -49,13 +62,17 @@
     public ObservableSet() {
       set = new HashSet<T>();
+      readOnlyView = ((ICollection<T>)set).IsReadOnly;
     }
     public ObservableSet(IEnumerable<T> collection) {
       set = new HashSet<T>(collection);
+      readOnlyView = ((ICollection<T>)set).IsReadOnly;
     }
     public ObservableSet(IEqualityComparer<T> comparer) {
       set = new HashSet<T>(comparer);
+      readOnlyView = ((ICollection<T>)set).IsReadOnly;
     }
     public ObservableSet(IEnumerable<T> collection, IEqualityComparer<T> comparer) {
       set = new HashSet<T>(collection, comparer);
+      readOnlyView = ((ICollection<T>)set).IsReadOnly;
     }
     #endregion
@@ -227,8 +244,15 @@
     #region Events
     [field: NonSerialized]
+    public event EventHandler ReadOnlyViewChanged;
+    protected virtual void OnReadOnlyViewChanged() {
+      EventHandler handler = ReadOnlyViewChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
+
+    [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<T> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<T> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -236,6 +260,6 @@
     public event CollectionItemsChangedEventHandler<T> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<T> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -243,6 +267,6 @@
     public event CollectionItemsChangedEventHandler<T> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
+      CollectionItemsChangedEventHandler<T> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
     }
 
@@ -250,6 +274,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
     #endregion
Index: trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableArray.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableArray.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableArray.cs	(revision 3317)
@@ -34,4 +34,9 @@
 
     #region Properties
+    public bool ReadOnlyView {
+      get { return true; }
+      set { throw new NotSupportedException(); }
+    }
+
     public int Length {
       get { return array.Length; }
@@ -117,9 +122,14 @@
     }
 
+    event EventHandler IObservableArray<T>.ReadOnlyViewChanged {
+      add { }
+      remove { }
+    }
+
     [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -127,6 +137,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsMoved;
     protected virtual void OnItemsMoved(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsMoved != null)
-        ItemsMoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsMoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -134,6 +144,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -141,6 +151,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
 
Index: trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableCollection.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableCollection.cs	(revision 3317)
@@ -34,4 +34,9 @@
 
     #region Properties
+    public bool ReadOnlyView {
+      get { return true; }
+      set { throw new NotSupportedException(); }
+    }
+
     public int Count {
       get { return collection.Count; }
@@ -95,9 +100,14 @@
     }
 
+    event EventHandler IObservableCollection<T>.ReadOnlyViewChanged {
+      add { }
+      remove { }
+    }
+
     [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<T> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<T> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -105,6 +115,6 @@
     public event CollectionItemsChangedEventHandler<T> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<T> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -112,6 +122,6 @@
     public event CollectionItemsChangedEventHandler<T> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
+      CollectionItemsChangedEventHandler<T> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
     }
 
@@ -119,6 +129,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
 
Index: trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableDictionary.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableDictionary.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableDictionary.cs	(revision 3317)
@@ -34,4 +34,9 @@
 
     #region Properties
+    public bool ReadOnlyView {
+      get { return true; }
+      set { throw new NotSupportedException(); }
+    }
+
     public ICollection<TKey> Keys {
       get { return dict.Keys; }
@@ -123,9 +128,14 @@
     }
 
+    event EventHandler IObservableCollection<KeyValuePair<TKey, TValue>>.ReadOnlyViewChanged {
+      add { }
+      remove { }
+    }
+
     [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<KeyValuePair<TKey, TValue>> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
     }
 
@@ -133,6 +143,6 @@
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<KeyValuePair<TKey, TValue>> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items));
     }
 
@@ -140,6 +150,6 @@
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<KeyValuePair<TKey, TValue>> items, IEnumerable<KeyValuePair<TKey, TValue>> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
     }
 
@@ -147,6 +157,6 @@
     public event CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<KeyValuePair<TKey, TValue>> items, IEnumerable<KeyValuePair<TKey, TValue>> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
+      CollectionItemsChangedEventHandler<KeyValuePair<TKey, TValue>> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<KeyValuePair<TKey, TValue>>(items, oldItems));
     }
 
@@ -154,6 +164,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
 
Index: trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableKeyedCollection.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableKeyedCollection.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableKeyedCollection.cs	(revision 3317)
@@ -34,4 +34,9 @@
 
     #region Properties
+    public bool ReadOnlyView {
+      get { return true; }
+      set { throw new NotSupportedException(); }
+    }
+
     public int Count {
       get { return collection.Count; }
@@ -112,9 +117,14 @@
     }
 
+    event EventHandler IObservableCollection<TItem>.ReadOnlyViewChanged {
+      add { }
+      remove { }
+    }
+
     [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<TItem> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<TItem> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<TItem>(items));
+      CollectionItemsChangedEventHandler<TItem> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items));
     }
 
@@ -122,6 +132,6 @@
     public event CollectionItemsChangedEventHandler<TItem> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<TItem> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<TItem>(items));
+      CollectionItemsChangedEventHandler<TItem> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items));
     }
 
@@ -129,6 +139,6 @@
     public event CollectionItemsChangedEventHandler<TItem> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<TItem> items, IEnumerable<TItem> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
+      CollectionItemsChangedEventHandler<TItem> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
     }
 
@@ -136,6 +146,6 @@
     public event CollectionItemsChangedEventHandler<TItem> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<TItem> items, IEnumerable<TItem> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
+      CollectionItemsChangedEventHandler<TItem> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<TItem>(items, oldItems));
     }
 
@@ -143,6 +153,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
 
Index: trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableList.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableList.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableList.cs	(revision 3317)
@@ -34,4 +34,9 @@
 
     #region Properties
+    public bool ReadOnlyView {
+      get { return true; }
+      set { throw new NotSupportedException(); }
+    }
+
     public int Count {
       get { return ((ICollection<T>)list).Count; }
@@ -119,9 +124,14 @@
     }
 
+    event EventHandler IObservableCollection<T>.ReadOnlyViewChanged {
+      add { }
+      remove { }
+    }
+
     [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<IndexedItem<T>> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
     }
 
@@ -133,6 +143,6 @@
     }
     private void OnItemsAdded(IEnumerable<T> items) {
-      if (itemsAdded != null)
-        itemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = itemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -140,6 +150,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<IndexedItem<T>> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items));
     }
 
@@ -151,6 +161,6 @@
     }
     private void OnItemsRemoved(IEnumerable<T> items) {
-      if (itemsRemoved != null)
-        itemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = itemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -158,6 +168,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsReplaced;
     protected virtual void OnItemsReplaced(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsReplaced != null)
-        ItemsReplaced(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsReplaced;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -165,6 +175,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> ItemsMoved;
     protected virtual void OnItemsMoved(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (ItemsMoved != null)
-        ItemsMoved(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = ItemsMoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -172,6 +182,6 @@
     public event CollectionItemsChangedEventHandler<IndexedItem<T>> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<IndexedItem<T>> items, IEnumerable<IndexedItem<T>> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
+      CollectionItemsChangedEventHandler<IndexedItem<T>> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<IndexedItem<T>>(items, oldItems));
     }
 
@@ -183,6 +193,6 @@
     }
     private void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (collectionReset != null)
-        collectionReset(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
+      CollectionItemsChangedEventHandler<T> handler = collectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
     }
 
@@ -190,6 +200,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
 
Index: trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableSet.cs
===================================================================
--- trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableSet.cs	(revision 3286)
+++ trunk/sources/HeuristicLab.Collections/3.3/ReadOnlyObservableSet.cs	(revision 3317)
@@ -34,4 +34,9 @@
 
     #region Properties
+    public bool ReadOnlyView {
+      get { return true; }
+      set { throw new NotSupportedException(); }
+    }
+
     public int Count {
       get { return set.Count; }
@@ -136,9 +141,14 @@
     }
 
+    event EventHandler IObservableCollection<T>.ReadOnlyViewChanged {
+      add { }
+      remove { }
+    }
+
     [field: NonSerialized]
     public event CollectionItemsChangedEventHandler<T> ItemsAdded;
     protected virtual void OnItemsAdded(IEnumerable<T> items) {
-      if (ItemsAdded != null)
-        ItemsAdded(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsAdded;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -146,6 +156,6 @@
     public event CollectionItemsChangedEventHandler<T> ItemsRemoved;
     protected virtual void OnItemsRemoved(IEnumerable<T> items) {
-      if (ItemsRemoved != null)
-        ItemsRemoved(this, new CollectionItemsChangedEventArgs<T>(items));
+      CollectionItemsChangedEventHandler<T> handler = ItemsRemoved;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items));
     }
 
@@ -153,6 +163,6 @@
     public event CollectionItemsChangedEventHandler<T> CollectionReset;
     protected virtual void OnCollectionReset(IEnumerable<T> items, IEnumerable<T> oldItems) {
-      if (CollectionReset != null)
-        CollectionReset(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
+      CollectionItemsChangedEventHandler<T> handler = CollectionReset;
+      if (handler != null) handler(this, new CollectionItemsChangedEventArgs<T>(items, oldItems));
     }
 
@@ -160,6 +170,6 @@
     public event PropertyChangedEventHandler PropertyChanged;
     protected virtual void OnPropertyChanged(string propertyName) {
-      if (PropertyChanged != null)
-        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
+      PropertyChangedEventHandler handler = PropertyChanged;
+      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }
 
