private void SetValue(T value, bool clearErrors, bool raiseUndoRedo) { var pm = value as IModelNode; if (pm != null) { pm.Parent = this; } if (IsEditing) { var oldValue = _editedValue; var newValue = value; _editedValue = newValue; var editable = newValue as IEditableObject; if (editable != null) { editable.BeginEdit(); } if (_isInterrogating) { return; } if (clearErrors) { _errors.Clear(); } UseInterrogators <IPropertyChangeAware <T> >( interrogators => { foreach (var validator in interrogators) { if (!validator.Interrogate(this)) { return; } } }); NotifyOfPropertyChange("Value"); _parent.NotifyOfPropertyChange(_definition.Name); BubblePropertyChange("IsDirty"); BubblePropertyChange("IsValid"); if (raiseUndoRedo) { var undoRedoHandle = new UndoRedoHandle( () => SetValue(oldValue, true, false), () => SetValue(newValue, true, false) ); BubbleModelChange(this, undoRedoHandle); } } else { _value = _editedValue = value; NotifyOfPropertyChange("Value"); _parent.NotifyOfPropertyChange(_definition.Name); } }