namespace VideoBrowser.Extensions { using System.Collections.Generic; using System.ComponentModel; using System.Runtime.CompilerServices; using VideoBrowser.Common; /// /// Defines the /// public static class INotifyPropertyChangedExtension { #region Delegates /// /// The PropertyChangedInvokerEventHandler /// /// The public delegate void PropertyChangedInvokerEventHandler(string propertyName); #endregion Delegates #region Methods /// /// Invokes the properties changed. /// /// The INotifyPropertyChanged implementation. /// The invoker. /// The property name list. public static void InvokePropertiesChanged(this INotifyPropertyChanged instance, PropertyChangedInvokerEventHandler invoker, params string[] propertyNames) { foreach (var propertyName in propertyNames) { invoker?.Invoke(propertyName); } } /// /// The IsMatch /// /// The /// The /// The public static bool IsMatch(this PropertyChangedEventArgs e, params string[] propertyNames) { var propertyName = e.PropertyName; foreach (var name in propertyNames) { if (propertyName == name) { return true; } } return false; } /// /// Sets the specified invoker. /// /// /// The instance. /// The invoker. /// The field. /// The value. /// Name of the property. /// The other optional property names to notify. /// True if old value and new value are different. public static bool Set(this INotifyPropertyChanged instance, PropertyChangedInvokerEventHandler invoker, ref T field, T value, [CallerMemberName] string propertyName = null, params string[] propertyNames) { if (EqualityComparer.Default.Equals(field, value)) { return false; } field = value; invoker?.Invoke(propertyName); return true; } /// /// The Set /// /// The sender /// The propertyChanged /// The field /// The value /// The range /// The propertyName /// The propertyNames /// The public static bool Set(this INotifyPropertyChanged sender, PropertyChangedEventHandler propertyChanged, ref double field, double value, RangeDouble range, [CallerMemberName] string propertyName = null, params string[] propertyNames) { if (field.IsEqualTo(value)) { return false; } if (value.IsInRange(range.Start, range.End)) { field = value; } propertyChanged?.Invoke(sender, new PropertyChangedEventArgs(propertyName)); return true; } /// /// The Set /// /// The property type. /// The sender. /// The property changed. /// The field. /// The value. /// Name of the property. /// The property names. /// True if old value and new value are different. public static bool Set(this INotifyPropertyChanged sender, PropertyChangedEventHandler propertyChanged, ref T field, T value, [CallerMemberName] string propertyName = null, params string[] propertyNames) { if (EqualityComparer.Default.Equals(field, value)) { return false; } field = value; propertyChanged?.Invoke(sender, new PropertyChangedEventArgs(propertyName)); return true; } #endregion Methods } }