Skip to main content
All docs
V25.1
  • .NET 8.0+

    PersistentBase.OnChanged(String, Object, Object) Method

    Invoked after an object’s property has been changed.

    Namespace: DevExpress.Xpo

    Assembly: DevExpress.Xpo.v25.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