Mercurial > pub > bltoolkit
view Extensions/JointureAddOn/Mapping/DataBindingFactory.cs @ 3:1ef98bd70424
!bug 100 +3h
Исправление проблемы BLToolkit + mono 3.4
author | cin |
---|---|
date | Fri, 22 Aug 2014 17:34:46 +0400 |
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)); } } } } }