我想创建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.SelectedObject
为Class A
,propertyName
为Width
,Width
不属于Class A
属性,为Size
财产,所以我得到了例外。
如何解决此问题?如何为这种情况创建undo/redo command
?
答案 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的名称