/// <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);
        }
Example #2
0
        /// <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);
        }