// --------------------------------------------------------------------------------------------------------------------
//
// This file is part of the HandBrake source code - It may be used under the terms of the GNU General Public License.
//
//
// A base class that implements the infrastructure for property change notification and automatically performs UI thread marshalling.
// Borrowed from Caliburn Micro
//
// --------------------------------------------------------------------------------------------------------------------
namespace HandBrakeWPF.Utilities
{
using System;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Runtime.Serialization;
using INotifyPropertyChangedEx = HandBrakeWPF.Utilities.Interfaces.INotifyPropertyChangedEx;
///
/// A base class that implements the infrastructure for property change notification and automatically performs UI thread marshalling.
///
[Serializable]
public class PropertyChangedBase : INotifyPropertyChangedEx, INotifyPropertyChanged
{
[NonSerialized]
private bool isNotifying;
///
/// Gets or sets a value indicating whether the Enables/Disables property change notification.
///
[Browsable(false)]
public bool IsNotifying
{
get
{
return this.isNotifying;
}
set
{
this.isNotifying = value;
}
}
///
/// Occurs when a property value changes.
///
public event PropertyChangedEventHandler PropertyChanged = (param0, param1) => { };
///
/// Initializes a new instance of the class.
/// Creates an instance of .
///
public PropertyChangedBase()
{
this.IsNotifying = true;
}
///
/// Raises a change notification indicating that all bindings should be refreshed.
///
public void Refresh()
{
this.NotifyOfPropertyChange(string.Empty);
}
///
/// Notifies subscribers of the property change.
///
/// Name of the property.
public virtual void NotifyOfPropertyChange(string propertyName)
{
if (!this.IsNotifying)
return;
Execute.OnUIThread((System.Action)(() => this.OnPropertyChanged(new PropertyChangedEventArgs(propertyName))));
}
///
/// Notifies subscribers of the property change.
///
/// The type of the property.The property expression.
public void NotifyOfPropertyChange(Expression> property)
{
this.NotifyOfPropertyChange(ExtensionMethods.GetMemberInfo((Expression)property).Name);
}
///
/// Raises the event directly.
///
/// The instance containing the event data.
[EditorBrowsable(EditorBrowsableState.Never)]
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler changedEventHandler = this.PropertyChanged;
if (changedEventHandler == null)
return;
changedEventHandler((object)this, e);
}
///
/// Called when the object is deserialized.
///
/// The streaming context.
[OnDeserialized]
public void OnDeserialized(StreamingContext c)
{
this.IsNotifying = true;
}
///
/// Used to indicate whether or not the IsNotifying property is serialized to Xml.
///
///
/// Whether or not to serialize the IsNotifying property. The default is false.
///
public virtual bool ShouldSerializeIsNotifying()
{
return false;
}
}
}