/// <summary> /// Sets the value of a property. If the value is different the current value of the property, <see cref="PropertyChanged"/> event is raised. /// </summary> /// <typeparam name="T">the type of the property</typeparam> /// <returns>True if the property value has been updated, otherwise false</returns> protected bool SetPropertyValue <T>(Expression <Func <T> > propertyAccessor, T value) { bool valueChanged = false; string propertyName = GetPropertyName(propertyAccessor); if (PropertyValues.ContainsKey(propertyName)) { PropertyValues.AddOrUpdate(propertyName, value, (key, previousValue) => { if (typeof(T).IsValueType) { valueChanged = previousValue == null || !previousValue.Equals(value); } else { // ReSharper disable CompareNonConstrainedGenericWithNull valueChanged = !previousValue?.Equals(value) ?? value != null; // ReSharper restore CompareNonConstrainedGenericWithNull } return(value); }); if (valueChanged) { OnPropertyChanged(propertyName); } } else { valueChanged = true; PropertyValues.AddOrUpdate(propertyName, value, (key, previousValue) => value); OnPropertyChanged(propertyName); } return(valueChanged); }
/// <summary> /// Sets the value of a property. If the value is different the current value of the property, /// <see cref="PropertyChanged" /> event is raised. /// </summary> /// <typeparam name="T">the type of the property</typeparam> /// <returns>True if the property value has been updated, otherwise false</returns> protected bool SetPropertyValue <T>(Expression <Func <T> > propertyAccessor, T value) { var valueChanged = false; var propertyName = GetPropertyName(propertyAccessor); if (PropertyValues.ContainsKey(propertyName)) { PropertyValues.AddOrUpdate(propertyName, value, (key, previousValue) => { if (typeof(T).GetTypeInfo().IsValueType) { valueChanged = previousValue == null || !previousValue.Equals(value); } else { valueChanged = !previousValue?.Equals(value) ?? value != null; } return(value); }); if (valueChanged) { OnPropertyChanged(propertyName); } } else { valueChanged = true; PropertyValues.AddOrUpdate(propertyName, value, (key, previousValue) => value); OnPropertyChanged(propertyName); } return(valueChanged); }