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 ApropertyNameis WidthWidthis n't 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

次に、クラス名を含む元に戻す情報を記録します。したがって、ユーザーが変更を元に戻すと、どのクラスを元に戻す必要があるかがわかります。

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 に答える