diff --git a/Microsoft.Toolkit.Mvvm/ComponentModel/ObservableObject.cs b/Microsoft.Toolkit.Mvvm/ComponentModel/ObservableObject.cs index 888a1900..d4795903 100644 --- a/Microsoft.Toolkit.Mvvm/ComponentModel/ObservableObject.cs +++ b/Microsoft.Toolkit.Mvvm/ComponentModel/ObservableObject.cs @@ -350,6 +350,36 @@ namespace Microsoft.Toolkit.Mvvm.ComponentModel return SetAndNotifyOnCompletion(ref field, fieldExpression, newValue, out _); } + /// + /// Compares the current and new values for a given field (which should be the backing + /// field for a property). If the value has changed, raises the + /// event, updates the field and then raises the event. + /// This method is just like , + /// with the difference being an extra parameter with a callback being invoked + /// either immediately, if the new task has already completed or is , or upon completion. + /// + /// The type of to set and monitor. + /// The field storing the property's value. + /// + /// An returning the field to update. + /// The property's value after the change occurred. + /// A callback to invoke to update the property value. + /// (optional) The name of the property that changed. + /// if the property was changed, otherwise. + /// + /// The and events are not raised + /// if the current and new value for the target property are the same. + /// + protected bool SetAndNotifyOnCompletion(ref TTask? field, Expression> fieldExpression, TTask? newValue, Action callback, [CallerMemberName] string propertyName = null!) + where TTask : Task + { + bool result = SetAndNotifyOnCompletion(ref field, fieldExpression, newValue, out Task task); + + task.ContinueWith(t => callback((TTask?)t)); + + return result; + } + /// /// Throws an when a given is invalid for a property. ///