1+ using System . ComponentModel ;
2+ using System . Diagnostics ;
3+ using System . Globalization ;
4+ using System . Reflection ;
5+ using System . Runtime . CompilerServices ;
6+
7+ namespace CADSnoop . Model
8+ {
9+ public class ViewModelBase : INotifyPropertyChanged
10+ {
11+ public event PropertyChangedEventHandler PropertyChanged ;
12+
13+ public virtual void OnPropertyChanged ( [ CallerMemberName ] string propertyName = null )
14+ {
15+ PropertyChanged ? . Invoke ( this , new PropertyChangedEventArgs ( propertyName ) ) ;
16+ }
17+
18+ // <summary>
19+ /// Called when the specified property has been changed.
20+ /// </summary>
21+ /// <param name="propertyName">Name of the property.</param>
22+ /// <param name="oldValue">The old value.</param>
23+ /// <param name="newValue">The new value.</param>
24+ protected virtual void OnPropertyChanged ( string propertyName , object oldValue , object newValue )
25+ {
26+ this . OnPropertyChanged ( propertyName ) ;
27+ }
28+
29+ #region Can Optimize
30+ /// <summary>
31+ ///
32+ /// </summary>
33+ /// <typeparam name="T"></typeparam>
34+ /// <param name="property"></param>
35+ /// <param name="value"></param>
36+ /// <param name="propertyName"></param>
37+ public void OnPropertyChanged < T > ( ref T property , T value , [ CallerMemberName ] string propertyName = "" )
38+ {
39+ property = value ;
40+ var handler = PropertyChanged ;
41+ if ( handler != null )
42+ {
43+ PropertyChanged ( this , new PropertyChangedEventArgs ( propertyName ) ) ;
44+ }
45+ }
46+
47+ #endregion
48+
49+ /// <summary>
50+ /// Sets the property value.
51+ /// </summary>
52+ /// <typeparam name="T">The type of the property.</typeparam>
53+ /// <param name="field">The field.</param>
54+ /// <param name="value">The value.</param>
55+ /// <param name="propertyName">Name of the property.</param>
56+ /// <returns>
57+ /// True if the property was set.
58+ /// </returns>
59+ /// <remarks>This method uses the CallerMemberNameAttribute to determine the property name.</remarks>
60+ protected bool SetValue < T > ( ref T field , T value , [ System . Runtime . CompilerServices . CallerMemberName ] string propertyName = "" )
61+ {
62+ // ReSharper disable once RedundantNameQualifier
63+ if ( object . Equals ( field , value ) )
64+ {
65+ return false ;
66+ }
67+ this . VerifyProperty ( propertyName ) ;
68+ //// this.OnPropertyChanging(propertyName, field, value);
69+ T oldValue = field ;
70+ field = value ;
71+ this . OnPropertyChanged ( propertyName , oldValue , value ) ;
72+ return true ;
73+ }
74+
75+ /// <summary>
76+ /// Verifies the property name.
77+ /// </summary>
78+ /// <param name="propertyName">Name of the property.</param>
79+ [ Conditional ( "DEBUG" ) ]
80+ private void VerifyProperty ( string propertyName )
81+ {
82+ var type = this . GetType ( ) ;
83+
84+ // Look for a public property with the specified name.
85+ var propertyInfo = type . GetTypeInfo ( ) . GetDeclaredProperty ( propertyName ) ;
86+
87+ Debug . Assert ( propertyInfo != null , string . Format ( CultureInfo . InvariantCulture , "{0} is not a property of {1}" , propertyName , type . FullName ) ) ;
88+ }
89+ }
90+ }
0 commit comments