/// <summary>
        /// Obtiene el valor existente de la propiedad y lo inserta en Redo.-
        /// Retira la ultima propiedad de del objeto en la pila Undo (esto es para establecerlo como el valor vigente de la propiedad)
        /// Establece al objeto padre el valor de la propiedad que esta en la pila undo
        /// </summary>
        public void Undo()
        {
            if (_UndoStack.Count > 0)
            {
                //Retira las ultimas propiedades  del objeto en la pila Undo
                List<PropertyValue> wPropertyValueUndoList = (List<PropertyValue>)_UndoStack.Pop();
                List<PropertyValue> wPropertyValueRedoList = new List<PropertyValue>();
                PropertyInfo wPropertyInfo;
                object wOldValue;
                PropertyValue wPropertyValueRedo;

                foreach (PropertyValue wPropertyValue in wPropertyValueUndoList)
                {
                    //Obtengo la propiedad del objeto 
                    wPropertyInfo = _ParentObjectType.GetProperty(wPropertyValue.PropertyName);

                    #region Primero Obtiene el valor existente y lo inserta en Redo.-
                    //Obtengo el valor de la propiedad wPropertyInfo
                    wOldValue = wPropertyInfo.GetValue(_ParentObject, null);

                    //Creo una PropertyValue con el valor de la propiedad y lo invcerto en la pila Redo 
                    wPropertyValueRedo = new PropertyValue(wPropertyValue.PropertyName, wOldValue);
                    wPropertyValueRedoList.Add(wPropertyValueRedo);
                    #endregion

     
                    wPropertyInfo.SetValue(_ParentObject, wPropertyValue.Value, null);
                }

                //Saco de la pila redo el ultimo PropertyValue list de propiedad ingresado
                _RedoStack.Push(wPropertyValueRedoList);

            }
        }
        /// <summary>
        /// Obtiene el valor existente de la propiedad y lo inserta en Redo.-
        /// Retira la ultima propiedad de del objeto en la pila Undo (esto es para establecerlo como el valor vigente de la propiedad)
        /// Establece al objeto padre el valor de la propiedad que esta en la pila undo
        /// </summary>
        public void Undo()
        {
            if (_UndoStack.Count > 0)
            {
                //Retira la ultima propiedad de del objeto en la pila Undo
                PropertyValue pPropertyValueUndo = (PropertyValue)_UndoStack.Pop();
                PropertyInfo wPropertyInfo = _ParentObjectType.GetProperty(pPropertyValueUndo.PropertyName);

                #region Primero Obtiene el valor existente y lo inserta en Redo.-

                object wOldValue = wPropertyInfo.GetValue(_ParentObject, null);
                PropertyValue _PropertyValueRedo = new PropertyValue(pPropertyValueUndo.PropertyName, wOldValue);
                _RedoStack.Push(_PropertyValueRedo);
                #endregion

                // apply the value that was popped off the undo stack
                wPropertyInfo.SetValue(_ParentObject, pPropertyValueUndo.Value, null);
            }
        }
        /// <summary>
        /// Redo
        /// </summary>
		public void Redo()
		{
			if (_RedoStack.Count>0)
			{
                //Retira la ultima propiedad de Redo
                PropertyValue wPropertyValue = (PropertyValue)_RedoStack.Pop();
            
                PropertyInfo wPropertyInfo = _ParentObjectType.GetProperty(wPropertyValue.PropertyName);

                #region Primero obtiene el valor existente y lo mete en la pila UNDO

                object wOldValue = wPropertyInfo.GetValue(_ParentObject,null);
                PropertyValue _PropertyValueUndo = new PropertyValue(wPropertyValue.PropertyName, wOldValue);
                _UndoStack.Push(_PropertyValueUndo);
                #endregion

                // apply the value that was popped off the redo stack
                wPropertyInfo.SetValue(_ParentObject, wPropertyValue.Value, null);
			}
		}
 /// <summary>
 /// El objeto padre llamara este metodo par aalmacenar el valor de la propiedad 
 /// antes de que esta sufra algun cambio.-
 /// </summary>
 /// <param name="propName">nombre de la propiedad</param>
 /// <param name="propVal">El valor anterior al cambio</param>
 public void Store(string propName, object propVal)
 {
     PropertyValue pVal = new PropertyValue(propName, propVal);
     //Inserto en la pila undo el par (name - value).-
     _UndoStack.Push(pVal);
 }
        /// <summary>
        /// Retira la ultima propiedad de Redo y las pasa a Undo
        /// </summary>
        public void Redo()
        {
            if (_RedoStack.Count > 0)
            {
                //Retira la ultima propiedad de Redo
                List<PropertyValue> wPropertyValueRedoList = (List<PropertyValue>)_RedoStack.Pop();
                List<PropertyValue> wPropertyValueUndoList = new List<PropertyValue>();
                PropertyInfo wPropertyInfo;
                object wOldValue;
                PropertyValue wPropertyValueUndo;

                foreach (PropertyValue wPropertyValue in wPropertyValueRedoList)
                {

                    wPropertyInfo = _ParentObjectType.GetProperty(wPropertyValue.PropertyName);

                    #region Primero obtiene el valor existente y lo mete en la pila UNDO

                    wOldValue = wPropertyInfo.GetValue(_ParentObject, null);
                    wPropertyValueUndo = new PropertyValue(wPropertyValue.PropertyName, wOldValue);
                    wPropertyValueUndoList.Add(wPropertyValueUndo);
                    #endregion

                    wPropertyInfo.SetValue(_ParentObject, wPropertyValue.Value, null);
                }


                _UndoStack.Push(wPropertyValueUndoList);
            }
        }