Skip to content

Instantly share code, notes, and snippets.

@velcrome
Created May 20, 2017 18:24
Show Gist options
  • Select an option

  • Save velcrome/34951808c6b8005242b140b05080bd46 to your computer and use it in GitHub Desktop.

Select an option

Save velcrome/34951808c6b8005242b140b05080bd46 to your computer and use it in GitHub Desktop.
DependencyProperty helpers
public static class DependencyPropertyExtensions
{
public static T GetValue<T>(this DependencyObject obj, Expression<Func<T>> expression)
{
var dpd = DependencyHelper.GetDpdFromExpression(expression);
return (T)dpd.GetValue(obj);
}
public static void SetValue<T>(this DependencyObject obj, Expression<Func<T>> expression, T value)
{
var dpd = DependencyHelper.GetDpdFromExpression(expression);
dpd.SetValue(obj, value);
}
}
public static class DependencyHelper
{
private static PropertyInfo GetPropertyInfoFromExpression(LambdaExpression lambda)
{
MemberExpression memberExpression;
if (lambda.Body is UnaryExpression)
{
var unaryExpression = lambda.Body as UnaryExpression;
memberExpression = unaryExpression.Operand as MemberExpression;
}
else
{
memberExpression = lambda.Body as MemberExpression;
}
return memberExpression.Member as PropertyInfo;
}
public static DependencyPropertyDescriptor GetDpdFromExpression<T>(Expression<Func<T>> expression)
{
var propertyInfo = GetPropertyInfoFromExpression(expression as LambdaExpression);
Type type = (expression.Body as MemberExpression).Expression.Type;
return DependencyPropertyDescriptor.FromName(propertyInfo.Name, type, type);
}
public static DependencyProperty Register<T, T2>(Expression<Func<T, T2>> expression, object defaultValue = null)
{
var propertyInfo = GetPropertyInfoFromExpression(expression as LambdaExpression);
string dependencyPropertyName = propertyInfo.Name;
DependencyProperty prop = DependencyProperty.Register(
dependencyPropertyName,
propertyInfo.PropertyType,
typeof(T),
new PropertyMetadata(defaultValue));
return prop;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment