Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>In the following example you have to pass 3 values (backing field, new value, property as lambda) but there are no magic strings and property changed event is only raised when it truly isn't equal.</p> <pre><code>class Sample : INotifyPropertyChanged { private string _name; public string Name { get { return _name; } set { this.SetProperty(ref _name, value, () =&gt; this.Name); } } protected void SetProperty&lt;T&gt;(ref T backingField, T newValue, Expression&lt;Func&lt;T&gt;&gt; propertyExpression) { if (backingField == null &amp;&amp; newValue == null) { return; } if (backingField == null || !backingField.Equals(newValue)) { backingField = newValue; this.OnPropertyChanged(propertyExpression); } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged&lt;T&gt;(Expression&lt;Func&lt;T&gt;&gt; propertyExpression) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyExpression.GetPropertyName())); } } } </code></pre> <p>And the following code contains extension methods to get a property name from a lambda expression.</p> <pre><code>public static class Extensions { public static string GetPropertyName&lt;TProperty&gt;(this Expression&lt;Func&lt;TProperty&gt;&gt; propertyExpression) { return propertyExpression.Body.GetMemberExpression().GetPropertyName(); } public static string GetPropertyName(this MemberExpression memberExpression) { if (memberExpression == null) { return null; } if (memberExpression.Member.MemberType != MemberTypes.Property) { return null; } var child = memberExpression.Member.Name; var parent = GetPropertyName(memberExpression.Expression.GetMemberExpression()); if (parent == null) { return child; } else { return parent + "." + child; } } public static MemberExpression GetMemberExpression(this Expression expression) { var memberExpression = expression as MemberExpression; if (memberExpression != null) { return memberExpression; } var unaryExpression = expression as UnaryExpression; if (unaryExpression != null) { memberExpression = (MemberExpression)unaryExpression.Operand; if (memberExpression != null) { return memberExpression; } } return null; } public static void ShouldEqual&lt;T&gt;(this T actual, T expected, string name) { if (!Object.Equals(actual, expected)) { throw new Exception(String.Format("{0}: Expected &lt;{1}&gt; Actual &lt;{2}&gt;.", name, expected, actual)); } } } </code></pre> <p>Finally some test code:</p> <pre><code>class q3191536 { public static void Test() { var sample = new Sample(); var propertyChanged = 0; sample.PropertyChanged += new PropertyChangedEventHandler((sender, e) =&gt; { if (e.PropertyName == "Name") { propertyChanged += 1; } } ); sample.Name = "Budda"; sample.Name.ShouldEqual("Budda", "sample.Name"); propertyChanged.ShouldEqual(1, "propertyChanged"); sample.Name = "Tim"; sample.Name.ShouldEqual("Tim", sample.Name); propertyChanged.ShouldEqual(2, "propertyChanged"); sample.Name = "Tim"; sample.Name.ShouldEqual("Tim", sample.Name); propertyChanged.ShouldEqual(2, "propertyChanged"); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload