根据propertyvaluechange事件创建undo / redo命令

时间:2012-09-23 18:34:59

标签: c# propertygrid

我想创建undo/redo command,可以为某些属性设置新值/旧值。我使用propertygrid来操纵属性值。我尝试使用PropertyValueChanged event

我的尝试:

private void pg_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
    var item = propertyGrid.SelectedObject;
    var propertyName = e.ChangedItem.PropertyDescriptor.Name;
    PropertyInfo pi = item.GetType().GetProperty(propertyName);

    var oldValue = e.OldValue;
    var newValue = propertyInfo.GetValue(item, null);

    //create command here
}

如果属性的父级是propertyGrid.SelectedObject,这样可以正常工作。 但如果我上课了:

Class A {
    public Size Size {get;set;}
}

它有时不起作用。 示例:propertyGrid.SelectedObjectClass ApropertyNameWidthWidth不属于Class A属性,为Size财产,所以我得到了例外。

如何解决此问题?如何为这种情况创建undo/redo command

3 个答案:

答案 0 :(得分:0)

以下是否有效?

private void pg_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
  var item = e.ChangedItem;
  var propertyName = item.PropertyDescriptor.Name;
  PropertyInfo pi = item.GetType().GetProperty(propertyName);

  var oldValue = e.OldValue;
  var newValue = propertyInfo.GetValue(item, null);

  //create command here
}

答案 1 :(得分:0)

在属性网格中查找数据的类名:

e.ChangedItem.PropertyDescriptor.ComponentType.Name

然后记录包含类名的撤消信息。因此,当用户撤消更改时,您知道哪个类需要撤消。

private void pg_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
        string className = e.ChangedItem.PropertyDescriptor.ComponentType.Name;
        string propertyName = e.ChangedItem.PropertyDescriptor.Name;

        var oldValue = e.OldValue;
        var newValue = e.ChangedItem.Value;

        //Record the above variables in your undo class
        //Something like
        RedoClass.AddToUndoList(className,propertyName,oldValue);
}

答案 2 :(得分:0)

一般来说,这对我有用:

private void prg_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
{
    var item = e.ChangedItem;
    var propertyName = item.PropertyDescriptor.Name;
    PropertyInfo pi = prg.SelectedObject.GetType().GetProperty(propertyName);

    var oldValue = e.OldValue;
    pi.SetValue(prg.SelectedObject, oldValue, null);
}

其中prg是PropertyGrid的名称