Mercurial > silverbladetech
diff MetroWpf/MetroWpf.Framework/Extensions/PropertyExtensions.cs @ 15:060f02cd4591
Initial commit, pre airport work
author | stevenh7776 stevenhollidge@hotmail.com |
---|---|
date | Mon, 12 Mar 2012 23:05:21 +0800 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MetroWpf/MetroWpf.Framework/Extensions/PropertyExtensions.cs Mon Mar 12 23:05:21 2012 +0800 @@ -0,0 +1,84 @@ +using System; +using System.ComponentModel; +using System.Linq.Expressions; + +namespace Chronos.Presentation.ViewModel +{ + /// <summary> + /// Property Extension Methods + /// </summary> + /// <remarks> + /// http://reyntjes.blogspot.com/2009/04/master-detail-viewmodel_24.html + /// http://blogs.ugidotnet.org/bmatte/archive/2008/11/28/pattern-model-view-viewmodel-inotifypropertychanged-static-reflection-e-extension-methods.aspx + /// </remarks> + public static class PropertyExtensions + { + #region · Extension Methods · + + /// <summary> + /// Creates a <see cref="PropertyChangedEventArgs" /> instance for a given property. + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="property">The property.</param> + /// <returns></returns> + public static PropertyChangedEventArgs CreateChangeEventArgs<T>(this Expression<Func<T>> property) + { + var expression = property.Body as MemberExpression; + var member = expression.Member; + + return new PropertyChangedEventArgs(member.Name); + } + + /// <summary> + /// Returns property name from expression + /// </summary> + /// <typeparam name="T"></typeparam> + /// <param name="property"></param> + /// <returns></returns> + public static string GetPropertyName<T>(this Expression<Func<T>> property) + { + var expression = property.Body as MemberExpression; + + return expression.Member.Name; + } + + /// <summary> + /// Return property name from expression. + /// </summary> + /// <example> + /// <![CDATA[ + /// Expression<Func<Item, object>> expression = i => i.Name; + /// var propertyName = expression.GetPropertyName(); // propertyName = "Name" + /// ]]> + /// </example> + /// <typeparam name="T"></typeparam> + /// <typeparam name="TValue"></typeparam> + /// <param name="expression"></param> + /// <returns></returns> + public static string GetPropertyName<T, TValue>(this Expression<Func<T, TValue>> expression) + { + var lambda = expression as LambdaExpression; + + MemberExpression memberExpression; + + if (lambda.Body is UnaryExpression) + { + var unaryExpression = lambda.Body as UnaryExpression; + memberExpression = unaryExpression.Operand as MemberExpression; + } + else + { + memberExpression = lambda.Body as MemberExpression; + } + + if (memberExpression != null) + { + return memberExpression.Member.Name; + } + + return null; + } + + #endregion + } +} \ No newline at end of file