/// <summary> /// Asserts that the specified object does not raise the <see cref="INotifyPropertyChanged.PropertyChanged"/> event. /// </summary> /// <typeparam name="TObject">The <see cref="Type">type</see> of <see cref="INotifyPropertyChanged">object</see> to test.</typeparam> /// <typeparam name="TValue">The <see cref="Type">type</see> of value to assign to the property.</typeparam> /// <param name="assert">The extended <see cref="Asserter"/>.</param> /// <param name="subject">The <see cref="INotifyPropertyChanged">object</see> to test.</param> /// <param name="testProperty">The <see cref="Expression{T}">expression</see> representing the test property.</param> /// <param name="value">The value to to assign to the tested property.</param> /// <include file="examples.xml" path="Types/Type[@name='INotifyPropertyChangedExtensions']/Member[@name='PropertyNotChanged`2']/example" /> public static void PropertyNotChanged <TObject, TValue>(this Asserter assert, TObject subject, Expression <Func <TObject, TValue> > testProperty, TValue value) where TObject : INotifyPropertyChanged { Arg.NotNull(assert, nameof(assert)); assert.AssertParameterIsNotNull(subject, nameof(subject)); assert.AssertParameterIsNotNull(testProperty, nameof(testProperty)); var changed = false; var test = subject.GetTestForProperty(assert, testProperty, out var propertyName); void OnPropertyChanged(object sender, PropertyChangedEventArgs e) { changed = true; propertyName = e.PropertyName; } subject.PropertyChanged += OnPropertyChanged; try { test(subject, value); } finally { subject.PropertyChanged -= OnPropertyChanged; } if (string.IsNullOrEmpty(propertyName)) { assert.IsFalse(changed, AllPropertiesChangedRaised); } else { assert.IsFalse(changed, PropertyChangedRaised, propertyName); } }