Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class MyClass : INotifyPropertyChanged
- {
- private string _foo;
- public string Foo
- {
- get { return _foo; }
- set
- {
- _foo = value;
- OnPropertyChanged(() => Foo, () => Baz);
- }
- }
- private int _bar;
- public int Bar
- {
- get { return _bar; }
- set
- {
- _bar = value;
- OnPropertyChanged(() => Bar, () => Baz);
- }
- }
- public string Baz
- {
- get { return _foo + _bar; }
- }
- public event PropertyChangedEventHandler PropertyChanged;
- protected virtual void OnPropertyChanged(string propertyName)
- {
- var handler = PropertyChanged;
- if (handler != null)
- handler(this, new PropertyChangedEventArgs(propertyName));
- }
- protected void OnPropertyChanged(params Expression<Func<object>>[] propertySelectors)
- {
- foreach (var expr in propertySelectors)
- {
- OnPropertyChanged(ExtractPropertyName(expr));
- }
- }
- protected static string ExtractPropertyName(Expression<Func<object>> propertySelector)
- {
- var memberExpr = propertySelector.Body as MemberExpression;
- if (memberExpr == null)
- {
- // Handle boxing of value types
- var boxingExpr = propertySelector.Body as UnaryExpression;
- if (boxingExpr != null && boxingExpr.NodeType == ExpressionType.Convert && boxingExpr.Type == typeof(object))
- {
- memberExpr = boxingExpr.Operand as MemberExpression;
- }
- }
- if (memberExpr != null)
- return memberExpr.Member.Name;
- throw new ArgumentException("Only member access expressions are supported");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement