| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 | namespace Caliburn.Micro.Core {    using System;    using System.ComponentModel;    using System.Linq.Expressions;    using System.Runtime.Serialization;    /// <summary>    /// A base class that implements the infrastructure for property change notification and automatically performs UI thread marshalling.    /// </summary>    [DataContract]    public class PropertyChangedBase : INotifyPropertyChangedEx {        /// <summary>        /// Creates an instance of <see cref = "PropertyChangedBase" />.        /// </summary>        public PropertyChangedBase() {            IsNotifying = true;        }        /// <summary>        /// Occurs when a property value changes.        /// </summary>        public virtual event PropertyChangedEventHandler PropertyChanged;        /// <summary>        /// Enables/Disables property change notification.        /// Virtualized in order to help with document oriented view models.        /// </summary>        public virtual bool IsNotifying { get; set; }        /// <summary>        /// Raises a change notification indicating that all bindings should be refreshed.        /// </summary>        public virtual void Refresh() {            NotifyOfPropertyChange(string.Empty);        }        /// <summary>        /// Notifies subscribers of the property change.        /// </summary>        /// <param name = "propertyName">Name of the property.</param>#if NET || SILVERLIGHT        public virtual void NotifyOfPropertyChange(string propertyName) {#else        public virtual void NotifyOfPropertyChange([System.Runtime.CompilerServices.CallerMemberName] string propertyName = null) {#endif            if (IsNotifying && PropertyChanged != null) {                Execute.OnUIThread(() => OnPropertyChanged(new PropertyChangedEventArgs(propertyName)));            }        }        /// <summary>        /// Notifies subscribers of the property change.        /// </summary>        /// <typeparam name = "TProperty">The type of the property.</typeparam>        /// <param name = "property">The property expression.</param>        public void NotifyOfPropertyChange<TProperty>(Expression<Func<TProperty>> property) {            NotifyOfPropertyChange(property.GetMemberInfo().Name);        }        /// <summary>        /// Raises the <see cref="PropertyChanged" /> event directly.        /// </summary>        /// <param name="e">The <see cref="PropertyChangedEventArgs"/> instance containing the event data.</param>        [EditorBrowsable(EditorBrowsableState.Never)]        protected void OnPropertyChanged(PropertyChangedEventArgs e) {            var handler = PropertyChanged;            if (handler != null) {                handler(this, e);            }        }        /// <summary>        /// Raises the property changed event immediately.        /// </summary>        /// <param name="propertyName">Name of the property.</param>        public virtual void RaisePropertyChangedEventImmediately(string propertyName)        {            if (IsNotifying)                RaisePropertyChangedEventCore(propertyName);        }        void RaisePropertyChangedEventCore(string propertyName)        {            var handler = PropertyChanged;            if (handler != null)                handler(this, new PropertyChangedEventArgs(propertyName));        }    }}
 |