Back to Devexpress

CloneObjectViewController.CustomCloneObject Event

expressappframework-devexpress-dot-expressapp-dot-cloneobject-dot-cloneobjectviewcontroller-33341623.md

latest6.7 KB
Original Source

CloneObjectViewController.CustomCloneObject Event

Occurs before the default cloning process begins.

Namespace : DevExpress.ExpressApp.CloneObject

Assembly : DevExpress.ExpressApp.CloneObject.v25.2.dll

NuGet Package : DevExpress.ExpressApp.CloneObject

Declaration

csharp
public event EventHandler<CustomCloneObjectEventArgs> CustomCloneObject
vb
Public Event CustomCloneObject As EventHandler(Of CustomCloneObjectEventArgs)

Event Data

The CustomCloneObject event's data class is CustomCloneObjectEventArgs. The following properties provide information specific to this event:

PropertyDescription
ClonedObjectThe target object of the cloning process.
SourceObjectGets the object to be cloned.
TargetObjectSpaceSpecifies the Object Space of the target object.
TargetTypeGets the type of the target object.

The event data class exposes the following methods:

MethodDescription
CreateDefaultTargetObjectSpace()Returns an Object Space for the CustomCloneObjectEventArgs.ClonedObject.

Remarks

When you handle this event and the handler’s ClonedObject parameter is initialized, the object passed via this parameter becomes the target object of the cloning process. Otherwise, XAF performs default cloning.

Handle this event to implement custom cloning logic. Pass the custom cloned object via the handler’s ClonedObject parameter. Pass the target object’s Object Space via the TargetObjectSpace parameter.

To manually clone a source object, handle this event and assign a custom cloned object to the CustomCloneObjectEventArgs.ClonedObject parameter. If the event is not handled or the ClonedObject parameter is null, XAF performs the default cloning is performed.

The CustomCloneObjectEventArgs.TargetObjectSpace parameter refers to an IObjectSpace object. Initialize the TargetObjectSpace property to use custom Object Space type object to clone an object.

Note

XAF raises an exception when you pass the handler’s ClonedObject parameter if the TargetObjectSpace parameter is null.

You can implement a custom DevExpress.Persistent.Base.Cloner class descendant to customize the cloning process and then call its CloneTo method in the CustomCloneObject event handler.

The following snippet overrides the Cloner.CopyMemberValue method to skip association properties during cloning.

csharp
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.CloneObject;
using DevExpress.Persistent.BaseImpl.EF;
using Microsoft.EntityFrameworkCore.Metadata;

namespace YourApplicationName.Module.Controllers;

public class CustomizeCloneObjectController: ObjectViewController {
    protected override void OnActivated() {
        base.OnActivated();
        var cloneObjectController = Frame.GetController<CloneObjectViewController>();
        if(cloneObjectController != null) {
            cloneObjectController.CustomCloneObject += cloneObjectController_CustomCloneObject;
        }
    }
    void cloneObjectController_CustomCloneObject(object sender, CustomCloneObjectEventArgs e) {
        e.TargetObjectSpace = e.CreateDefaultTargetObjectSpace();
        var cloner = new MyCloner(e.TargetObjectSpace);
        object objectFromTargetObjectSpace = e.TargetObjectSpace.GetObject(e.SourceObject);
        e.ClonedObject = cloner.CloneTo(objectFromTargetObjectSpace, e.TargetType);
    }
}

public class MyCloner: Cloner {
    public MyCloner(IObjectSpace objectSpace) : base(objectSpace) {
    }
    public override void CopyPropertyValue(
        IPropertyBase property, object sourceObject, object targetObject) {
        if(!(property is IReadOnlyNavigationBase)) {
            base.CopyPropertyValue(property, sourceObject, targetObject);
        }
    }
}
csharp
using DevExpress.ExpressApp.CloneObject;
using DevExpress.Xpo.Metadata;
using DevExpress.Xpo;
using DevExpress.Persistent.Base;
//...

namespace YourApplicationName.Module.Controllers;

public class CustomizeCloneObjectController : ObjectViewController {
    protected override void OnActivated() {
        base.OnActivated();
        var cloneObjectController = Frame.GetController<CloneObjectViewController>();
        if (cloneObjectController != null) {
            cloneObjectController.CustomCloneObject += cloneObjectController_CustomCloneObject;
        }
    }
    void cloneObjectController_CustomCloneObject(object sender, CustomCloneObjectEventArgs e) {
        var cloner = new MyCloner();
        e.TargetObjectSpace = e.CreateDefaultTargetObjectSpace();
        object objectFromTargetObjectSpace = e.TargetObjectSpace.GetObject(e.SourceObject);
        e.ClonedObject = cloner.CloneTo(objectFromTargetObjectSpace, e.TargetType);
    }
}
public class MyCloner : Cloner {
    public override void CopyMemberValue(
        XPMemberInfo memberInfo, IXPSimpleObject sourceObject, IXPSimpleObject targetObject) {
        if (!memberInfo.IsAssociation) {
            base.CopyMemberValue(memberInfo, sourceObject, targetObject);
        }
    }
}

See Also

CloneObjectViewController Class

CloneObjectViewController Members

DevExpress.ExpressApp.CloneObject Namespace