1

我想创建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.SelectedObjectis Class A, propertyNameis Width, Widthis not Class Aproperty, it is Sizeproperty, 所以我得到了异常。

我该如何解决这个问题?如何创造undo/redo command这种情况?

4

3 回答 3

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
}
于 2012-09-23T19:45:13.397 回答
0

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

e.ChangedItem.PropertyDescriptor.ComponentType.Name

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

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);
}
于 2015-04-08T00:38:52.923 回答
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 的名称

于 2015-04-29T11:29:07.640 回答