Skip to main content
.NET Framework 4.5.2+

PersistentBase.OnChanged(String, Object, Object) Method

Invoked after an object’s property has been changed.

Namespace: DevExpress.Xpo

Assembly: DevExpress.Xpo.v24.1.dll

NuGet Package: DevExpress.Xpo

Declaration

protected virtual void OnChanged(
    string propertyName,
    object oldValue,
    object newValue
)

Parameters

Name Type Description
propertyName String

A property whose value was changed.

oldValue Object

An old value.

newValue Object

A new value.

Remarks

Override this method in your PersistentBase descendants to add custom logic to a persistent object after the current object has been changed.

The code sample below demonstrates how to use the OnChanged method to declare persistent properties.

DateTime fOrderDate;
public DateTime OrderDate {
    get { return fOrderDate; }
    set {
        if(fOrderDate != value) {
            DateTime OldValue = fOrderDate;
            fOrderDate = value;
            OnChanged(nameof(OrderDate), OldValue, fOrderDate);
        }
    }
}

Example

The example below demonstrated how to automatically populate the CreatedBy, CreatedOn, UpdatedBy, and UpdatedOn properties (audit columns) in an XAF business class.

using DevExpress.Xpo;  
...

namespace YourSolutionName.BusinessObjects {  
    [DefaultClassOptions]  
    public class Contact : BaseObject {  
        public Contact(Session session)  
            : base(session) {  
        }  
        // Get a current active user
        ApplicationUser GetCurrentUser() {  
            return Session.GetObjectByKey<ApplicationUser>(
                Session.ServiceProvider.GetRequiredService<ISecurityStrategyBase>().UserId);
        }  
        // Automatically fill the CreatedOn and CreatedBy columns 
        // when a current user creates a new Contact item.
        public override void AfterConstruction() {  
            base.AfterConstruction();  
            CreatedOn = DateTime.Now;  
            CreatedBy = GetCurrentUser();  
        }  
        // Automatically fill the UpdatedOn and UpdatedBy columns 
        // when a current user saves a modified Contact item.
        protected override void OnSaving() {  
            base.OnSaving();  
            UpdatedOn = DateTime.Now;  
            UpdatedBy = GetCurrentUser();  
        }

        protected override void OnChanged(string propertyName, object oldValue, object newValue) {
            base.OnChanged(propertyName, oldValue, newValue);
            if(!IsLoading) {
                switch(propertyName) {
                    // Run custom code when the "Email" property value is changed.
                    case nameof(Email):
                        UpdateContacts();
                        break;
                }
            }
        }

        ApplicationUser createdBy;  
        public ApplicationUser CreatedBy {  
            get { return createdBy; }  
            set { SetPropertyValue("CreatedBy", ref createdBy, value); }  
        }  
        DateTime createdOn;  
        public DateTime CreatedOn {  
            get { return createdOn; }  
            set { SetPropertyValue("CreatedOn", ref createdOn, value); }  
        }  
        ApplicationUser updatedBy;  
        public ApplicationUser UpdatedBy {  
            get { return updatedBy; }  
            set { SetPropertyValue("UpdatedBy", ref updatedBy, value); }  
        }  
        DateTime updatedOn;  
        public DateTime UpdatedOn {  
            get { return updatedOn; }  
            set { SetPropertyValue("UpdatedOn", ref updatedOn, value); }  
        }  
    }  
}  
See Also