Mercurial > pub > bltoolkit
view Extensions/JointureAddOn/Mapping/DataBindingFactory.cs @ 9:1e85f66cf767 default tip
update bltoolkit
author | nickolay |
---|---|
date | Thu, 05 Apr 2018 20:53:26 +0300 |
parents | f990fcb411a9 |
children |
line wrap: on
line source
using System; using System.ComponentModel; using Castle.DynamicProxy; namespace BLToolkit.Mapping { public static class DataBindingFactory { private static readonly ProxyGenerator ProxyGenerator = new ProxyGenerator(); public static T Create<T>() { return (T) Create(typeof (T)); } public static object Create(Type type) { return ProxyGenerator.CreateClassProxy(type, new[] { typeof (INotifyPropertyChanged), typeof (IMarkerInterface) }, new NotifyPropertyChangedInterceptor(type.FullName)); } public interface IMarkerInterface { string TypeName { get; } } public class NotifyPropertyChangedInterceptor : IInterceptor { private readonly string typeName; private PropertyChangedEventHandler subscribers = delegate { }; public NotifyPropertyChangedInterceptor(string typeName) { this.typeName = typeName; } public void Intercept(IInvocation invocation) { if (invocation.Method.DeclaringType == typeof (IMarkerInterface)) { invocation.ReturnValue = typeName; return; } if (invocation.Method.DeclaringType == typeof (INotifyPropertyChanged)) { var propertyChangedEventHandler = (PropertyChangedEventHandler) invocation.Arguments[0]; if (invocation.Method.Name.StartsWith("add_")) { subscribers += propertyChangedEventHandler; } else { subscribers -= propertyChangedEventHandler; } return; } invocation.Proceed(); if (invocation.Method.Name.StartsWith("set_")) { var propertyName = invocation.Method.Name.Substring(4); subscribers(invocation.InvocationTarget, new PropertyChangedEventArgs(propertyName)); } } } } }