master
 1using System;
 2using System.ComponentModel;
 3using System.Linq.Expressions;
 4
 5namespace MVPtoMVVM.mvvm.viewmodels
 6{
 7    public class Synchronizer<T> where T : INotifyPropertyChanged
 8    {
 9        private readonly Func<PropertyChangedEventHandler> eventHandler;
10
11        public Synchronizer(Func<PropertyChangedEventHandler> eventHandler)
12        {
13            this.eventHandler = eventHandler;
14        }
15
16        public void Update(T viewModel, Expression<Func<T, object>> property)
17        {
18            eventHandler()(viewModel, new PropertyChangedEventArgs(GetPropertyNameFrom(property)));
19        }
20
21        string GetPropertyNameFrom(Expression<Func<T, object>> property)
22        {
23            if (property.Body.NodeType == ExpressionType.Convert)
24            {
25                var body = (UnaryExpression)property.Body;
26                return (body.Operand as MemberExpression).Member.Name;
27            }
28            if (property.Body.NodeType == ExpressionType.MemberAccess)
29            {
30                return (property.Body as MemberExpression).Member.Name;
31            }
32            return "";
33        }
34    }
35}