summaryrefslogtreecommitdiff
path: root/src/MVPtoMVVM.mvvm/viewmodels/Synchronizer.cs
blob: 09c6302235ebb54e5f5cebca80b2c6c4ec4d441c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.ComponentModel;
using System.Linq.Expressions;

namespace MVPtoMVVM.mvvm.viewmodels
{
    public class Synchronizer<T> where T : INotifyPropertyChanged
    {
        private readonly Func<PropertyChangedEventHandler> eventHandler;

        public Synchronizer(Func<PropertyChangedEventHandler> eventHandler)
        {
            this.eventHandler = eventHandler;
        }

        public void Update(T viewModel, Expression<Func<T, object>> property)
        {
            eventHandler()(viewModel, new PropertyChangedEventArgs(GetPropertyNameFrom(property)));
        }

        string GetPropertyNameFrom(Expression<Func<T, object>> property)
        {
            if (property.Body.NodeType == ExpressionType.Convert)
            {
                var body = (UnaryExpression)property.Body;
                return (body.Operand as MemberExpression).Member.Name;
            }
            if (property.Body.NodeType == ExpressionType.MemberAccess)
            {
                return (property.Body as MemberExpression).Member.Name;
            }
            return "";
        }
    }
}