Index: stable/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs
===================================================================
--- stable/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 17097)
+++ stable/HeuristicLab.Parameters/3.3/OptionalConstrainedValueParameter.cs	(revision 17149)
@@ -22,8 +22,8 @@
 using System;
 using System.Drawing;
+using HEAL.Attic;
 using HeuristicLab.Collections;
 using HeuristicLab.Common;
 using HeuristicLab.Core;
-using HEAL.Attic;
 
 namespace HeuristicLab.Parameters {
@@ -40,5 +40,5 @@
       }
     }
-      
+
     [Storable]
     private ItemSet<T> validValues;
@@ -52,4 +52,5 @@
       get { return this.value; }
       set {
+        if (ReadOnly) throw new InvalidOperationException("Cannot set the value of a readonly parameter.");
         if (value != this.value) {
           if ((value != null) && !validValues.Contains(value)) throw new ArgumentException("Invalid value.");
@@ -74,4 +75,15 @@
     }
 
+    [Storable(DefaultValue = false)]
+    private bool readOnly;
+    public bool ReadOnly {
+      get { return readOnly; }
+      set {
+        if (value == readOnly) return;
+        readOnly = value;
+        OnReadOnlyChanged();
+      }
+    }
+
     [Storable(DefaultValue = true)]
     private bool getsCollected;
@@ -93,4 +105,5 @@
       validValues = cloner.Clone(original.validValues);
       value = cloner.Clone(original.value);
+      readOnly = original.readOnly;
       getsCollected = original.getsCollected;
       Initialize();
@@ -99,4 +112,5 @@
       : base("Anonymous", typeof(T)) {
       this.validValues = new ItemSet<T>();
+      this.readOnly = false;
       this.getsCollected = true;
       Initialize();
@@ -105,11 +119,6 @@
       : base(name, typeof(T)) {
       this.validValues = new ItemSet<T>();
-      this.getsCollected = true;
-      Initialize();
-    }
-    public OptionalConstrainedValueParameter(string name, bool getsCollected)
-      : base(name, typeof(T)) {
-      this.validValues = new ItemSet<T>();
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       Initialize();
     }
@@ -117,11 +126,6 @@
       : base(name, typeof(T)) {
       this.validValues = validValues;
-      this.getsCollected = true;
-      Initialize();
-    }
-    public OptionalConstrainedValueParameter(string name, ItemSet<T> validValues, bool getsCollected)
-      : base(name, typeof(T)) {
-      this.validValues = validValues;
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       Initialize();
     }
@@ -130,12 +134,6 @@
       this.validValues = validValues;
       this.value = value;
-      this.getsCollected = true;
-      Initialize();
-    }
-    public OptionalConstrainedValueParameter(string name, ItemSet<T> validValues, T value, bool getsCollected)
-      : base(name, typeof(T)) {
-      this.validValues = validValues;
-      this.value = value;
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       Initialize();
     }
@@ -143,11 +141,6 @@
       : base(name, description, typeof(T)) {
       this.validValues = new ItemSet<T>();
-      this.getsCollected = true;
-      Initialize();
-    }
-    public OptionalConstrainedValueParameter(string name, string description, bool getsCollected)
-      : base(name, description, typeof(T)) {
-      this.validValues = new ItemSet<T>();
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       Initialize();
     }
@@ -155,11 +148,6 @@
       : base(name, description, typeof(T)) {
       this.validValues = validValues;
-      this.getsCollected = true;
-      Initialize();
-    }
-    public OptionalConstrainedValueParameter(string name, string description, ItemSet<T> validValues, bool getsCollected)
-      : base(name, description, typeof(T)) {
-      this.validValues = validValues;
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       Initialize();
     }
@@ -168,12 +156,6 @@
       this.validValues = validValues;
       this.value = value;
-      this.getsCollected = true;
-      Initialize();
-    }
-    public OptionalConstrainedValueParameter(string name, string description, ItemSet<T> validValues, T value, bool getsCollected)
-      : base(name, description, typeof(T)) {
-      this.validValues = validValues;
-      this.value = value;
-      this.getsCollected = getsCollected;
+      this.readOnly = false;
+      this.getsCollected = true;
       Initialize();
     }
@@ -212,4 +194,9 @@
       OnToStringChanged();
     }
+    public event EventHandler ReadOnlyChanged;
+    protected virtual void OnReadOnlyChanged() {
+      EventHandler handler = ReadOnlyChanged;
+      if (handler != null) handler(this, EventArgs.Empty);
+    }
     public event EventHandler GetsCollectedChanged;
     protected virtual void OnGetsCollectedChanged() {
