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));
- }
- }
- }
|