コード例 #1
0
        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);
            }
        }