diff --git a/src/FreshMvvm/FreshBasePageModel.cs b/src/FreshMvvm/FreshBasePageModel.cs index 28ee6ab..2f6949d 100644 --- a/src/FreshMvvm/FreshBasePageModel.cs +++ b/src/FreshMvvm/FreshBasePageModel.cs @@ -9,10 +9,8 @@ namespace FreshMvvm { - public abstract class FreshBasePageModel : INotifyPropertyChanged - { - public event PropertyChangedEventHandler PropertyChanged; - + public abstract class FreshBasePageModel : FreshObservableObject + { /// /// This event is raise when a page is Popped, this might not be raise everytime a page is Popped. /// Note* this might be raised multiple times. @@ -55,14 +53,6 @@ public virtual void Init (object initData) { } - protected void RaisePropertyChanged ([CallerMemberName] string propertyName = null) - { - var handler = PropertyChanged; - if (handler != null) { - handler (this, new PropertyChangedEventArgs (propertyName)); - } - } - internal void WireEvents (Page page) { page.Appearing += ViewIsAppearing; diff --git a/src/FreshMvvm/FreshMvvm.csproj b/src/FreshMvvm/FreshMvvm.csproj index 8c21af8..64d92fa 100644 --- a/src/FreshMvvm/FreshMvvm.csproj +++ b/src/FreshMvvm/FreshMvvm.csproj @@ -1,4 +1,4 @@ - + Debug @@ -31,6 +31,7 @@ false + diff --git a/src/FreshMvvm/FreshObservableObject.cs b/src/FreshMvvm/FreshObservableObject.cs new file mode 100644 index 0000000..89680b9 --- /dev/null +++ b/src/FreshMvvm/FreshObservableObject.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.CompilerServices; + +namespace FreshMvvm +{ + /// + /// Observable object with INotifyPropertyChanged implemented + /// + public abstract class FreshObservableObject : INotifyPropertyChanged + { + /// + /// Occurs when property changed. + /// + public event PropertyChangedEventHandler PropertyChanged; + + /// + /// Sets the property. + /// + /// true, if property was set, false otherwise. + /// Backing store. + /// Value. + /// Property name. + /// On changed. + /// The 1st type parameter. + protected bool SetProperty( + ref T backingStore, T value, + [CallerMemberName]string propertyName = "", + Action onChanged = null) + { + if (EqualityComparer.Default.Equals(backingStore, value)) + return false; + + backingStore = value; + + if (onChanged != null) + onChanged.Invoke(); + + RaisePropertyChanged(propertyName); + return true; + } + + /// + /// Raises the property changed event. + /// + /// Property name. + protected void RaisePropertyChanged([CallerMemberName] string propertyName = null) + { + var handler = PropertyChanged; + if (handler != null) + { + handler(this, new PropertyChangedEventArgs(propertyName)); + } + } + } +}