Skip to content

Instantly share code, notes, and snippets.

@sandyarmstrong
Created June 1, 2012 15:29
Show Gist options
  • Save sandyarmstrong/2852963 to your computer and use it in GitHub Desktop.
Save sandyarmstrong/2852963 to your computer and use it in GitHub Desktop.
using System;
using System.ComponentModel;
using System.Linq.Expressions;
using System.Reflection;
namespace WovenClient.Extensions
{
// Based on code from http://www.ingebrigtsen.info/post/2008/12/11/INotifyPropertyChanged-revisited.aspx
public static class NotifyPropertyChangedExtensions
{
public static void Notify (this PropertyChangedEventHandler eventHandler, Expression<Func<object>> expression)
{
if (eventHandler == null) {
return;
}
MemberExpression memberExpression = expression.Body as MemberExpression;
if (memberExpression == null) {
var unaryExpression = expression.Body as UnaryExpression;
if (unaryExpression != null) {
memberExpression = unaryExpression.Operand as MemberExpression;
}
}
if (memberExpression == null) {
return;
}
var constantExpression = memberExpression.Expression as ConstantExpression;
var propertyInfo = memberExpression.Member as PropertyInfo;
if (constantExpression == null || propertyInfo == null) {
return;
}
foreach (var del in eventHandler.GetInvocationList ()) {
del.DynamicInvoke (new object [] {
constantExpression.Value,
new PropertyChangedEventArgs (propertyInfo.Name)
});
}
}
public delegate void PropertyChangedHandler<T> (T sender);
public static void SubscribeToChange<T> (
this T objectThatNotifies, Expression<Func<object>> expression, PropertyChangedHandler<T> handler)
where T : INotifyPropertyChanged
{
objectThatNotifies.PropertyChanged += (s, e) => {
MemberExpression memberExpression = expression.Body as MemberExpression;
if (memberExpression == null) {
var unaryExpression = expression.Body as UnaryExpression;
if (unaryExpression != null) {
memberExpression = unaryExpression.Operand as MemberExpression;
}
}
if (memberExpression == null) {
return;
}
var propertyInfo = memberExpression.Member as PropertyInfo;
if (propertyInfo == null) {
return;
}
if (e.PropertyName.Equals (propertyInfo.Name)) {
handler (objectThatNotifies);
}
};
}
}
}
@sandyarmstrong
Copy link
Author

An example for each of these...subscribe to change on data object, notify UI of change:

        photoGroup.SubscribeToChange (
            () => photoGroup.NewItemCount,
            (g) => {
                PropertyChanged.Notify (() => this.NewCount);
            });

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment