Information Technology Reference
In-Depth Information
public static class
PropertyNotifyExtensions
{
public static
T SetNotifyProperty<T>(
this
PropertyChangedEventHandler
handler,
T newValue,
Expression
<
Func
<T>> oldValueExpression,
Action
<T> setter)
{
return
SetNotifyProperty(handler,
null
, newValue,
oldValueExpression, setter);
}
public static
T SetNotifyProperty<T>(
this
PropertyChangedEventHandler
postHandler,
PropertyChangingEventHandler
preHandler,
T newValue,
Expression
<
Func
<T>> oldValueExpression,
Action
<T> setter)
{
Func
<T> getter = oldValueExpression.Compile();
T oldValue = getter();
if
(!oldValue.Equals(newValue))
{
var
body = oldValueExpression.Body
as
System.Linq.Expressions.
MemberExpression
;
var
propInfo = body.Member
as
PropertyInfo
;
string
propName = body.Member.Name;
// Get the target object
var
targetExpression = body.Expression
as
ConstantExpression
;
object
target = targetExpression.Value;
if
(preHandler !=
null
)
preHandler(target,
new
PropertyChangingEventArgs
(propName));
// Use Reflection to do the set:
// propInfo.SetValue(target, newValue, null);
//var compiledSetter = setter.Compile();
setter(newValue);