рдкрдВрдЬреАрдХрд░рдг рдХрд╛ рд╕рд░рд▓реАрдХрд░рдг рдФрд░ DependencyProperty рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ

рдбрдмреНрд▓реНрдпреВрдкреАрдПрдл / рд╕рд┐рд▓реНрд╡рд░рд▓рд╛рдЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рд╕рдордп-рд╕рдордп рдкрд░ рдХрд╕реНрдЯрдо рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реАрдкреНрд░реЙрдкрд░реНрдЯреА рддреИрдпрд╛рд░ рдХрд░рдиреА рд╣реЛрддреА рд╣реИ, рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рддреЗ рд╕рдордпред рд╡рд┐рдЬреНрдЮрд╛рдкрди рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдиреБрдХрд╕рд╛рди рд╣реИрдВ, рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред рддрджрдиреБрд╕рд╛рд░, рдкрдВрдЬреАрдХрд░рдг рдХреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдФрд░ DependencyProperty рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛ред

рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдорд╛рдирдХ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реАрдкреНрд░реЙрдкрд░реНрдЯреА рдШреЛрд╖рдгрд╛ рдХреЛрдб рд╣реИ:
public class SomeDependecyObject : DependencyObject { public static readonly DependencyProperty IntValueProperty = DependencyProperty.Register("IntValue", typeof(int), typeof(SomeDependecyObject), new UIPropertyMetadata(1, OnIntValuePropertyChanged)); public int IntValue { get { return (int)GetValue(IntValueProperty); } set { SetValue(IntValueProperty, value); } } private static void OnIntValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { int newPropertyValue = (int)e.NewValue; SomeDependecyObject instance = (SomeDependecyObject)d; // Perform callback action. } } 

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдиреБрдХрд╕рд╛рди:

рдмрдврд╝рд╛рдпрд╛ рд╡рд┐рдХрд▓реНрдк рдХреЛрдб:
 public class SomeDependecyObject : DependencyObject { public static readonly DependencyProperty IntValueProperty = DependencyProperty<SomeDependecyObject>.Register(x => x.IntValue, 1, x => x.OnIntValuePropertyChanged); public int IntValue { get { return (int)GetValue(IntValueProperty); } set { SetValue(IntValueProperty, value); } } private void OnIntValuePropertyChanged(DependencyPropertyChangedEventArgs<int> e) { } } 

рдЗрд╕ рдЕрд╡рддрд╛рд░ рдореЗрдВ, рд░рдЬрд┐рд╕реНрдЯрд░ рд╡рд┐рдзрд┐ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдФрд░ рдПрдХ рд╕реНрдерд┐рд░ рдХреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИред рдХреЙрд▓рдмреИрдХ рд╡рд┐рдзрд┐, рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реАрдкреНрд░реЛрдкрд░реЗрдЯреАрдЪреЗрдВрдбреАрдПрд╡реЗрдВрдЯрдПрд░рдЧ рдХреНрд▓рд╛рд╕ рдХреЗ рдЬреЗрдиреЗрд░рд┐рдХ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ, рдЬрд╣рд╛рдВ рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рд╕рдВрдкрддреНрддрд┐ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЛ рднреА рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдЧрд▓рд╛, рдореИрдВ рдЙрди рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдХреЛрдб рджреВрдВрдЧрд╛ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

DependecyProperty рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб:
 public static class DependencyProperty<T> where T : DependencyObject { public static DependencyProperty Register<TProperty>(Expression<Func<T, TProperty>> propertyExpression) { return Register<TProperty>(propertyExpression, default(TProperty), null); } public static DependencyProperty Register<TProperty>(Expression<Func<T, TProperty>> propertyExpression, TProperty defaultValue) { return Register<TProperty>(propertyExpression, defaultValue, null); } public static DependencyProperty Register<TProperty>(Expression<Func<T, TProperty>> propertyExpression, Func<T, PropertyChangedCallback<TProperty>> propertyChangedCallbackFunc) { return Register<TProperty>(propertyExpression, default(TProperty), propertyChangedCallbackFunc); } public static DependencyProperty Register<TProperty>(Expression<Func<T, TProperty>> propertyExpression, TProperty defaultValue, Func<T, PropertyChangedCallback<TProperty>> propertyChangedCallbackFunc) { string propertyName = propertyExpression.RetrieveMemberName(); PropertyChangedCallback callback = ConvertCallback(propertyChangedCallbackFunc); return DependencyProperty.Register(propertyName, typeof(TProperty), typeof(T), new PropertyMetadata(defaultValue, callback)); } private static PropertyChangedCallback ConvertCallback<TProperty>(Func<T, PropertyChangedCallback<TProperty>> propertyChangedCallbackFunc) { if (propertyChangedCallbackFunc == null) return null; return new PropertyChangedCallback((d, e) => { PropertyChangedCallback<TProperty> callback = propertyChangedCallbackFunc((T)d); if (callback != null) callback(new DependencyPropertyChangedEventArgs<TProperty>(e)); }); } } public delegate void PropertyChangedCallback<TProperty>(DependencyPropertyChangedEventArgs<TProperty> e); 

рдпрд╣ рд╢реНрд░реЗрдгреА, рдЬреЗрдиреЗрд░рд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, DependencyObject рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрдИ рдЕрддрд┐рднрд╛рд░рд┐рдд рд░рдЬрд┐рд╕реНрдЯрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд░рдЬрд┐рд╕реНрдЯрд░ рд╡рд┐рдзрд┐ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдирд╛рдо рд╕реЗ рдЕрдкрдирд╛ рдирд╛рдо рд▓реЗрддреА рд╣реИ, рдХреЙрд▓рдмреИрдХ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ рдорд╛рдирдХ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реАрдкреНрд░реЙрдкрд░реНрдЯреА рдмрдирд╛рддреА рд╣реИред

DependecyPropertyChangedEventArgs рд╡рд░реНрдЧ рдХреЛрдб:
 public class DependencyPropertyChangedEventArgs<T> : EventArgs { public DependencyPropertyChangedEventArgs(DependencyPropertyChangedEventArgs e) { NewValue = (T)e.NewValue; OldValue = (T)e.OldValue; Property = e.Property; } public T NewValue { get; private set; } public T OldValue { get; private set; } public DependencyProperty Property { get; private set; } } 

рд╡реИрдХрд▓реНрдкрд┐рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреНрд▓рд╛рд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдб, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 public static class ExpressionExtensions { public static string RetrieveMemberName<TArg, TRes>(this Expression<Func<TArg, TRes>> propertyExpression) { MemberExpression memberExpression = propertyExpression.Body as MemberExpression; if (memberExpression == null) { UnaryExpression unaryExpression = propertyExpression.Body as UnaryExpression; if (unaryExpression != null) memberExpression = unaryExpression.Operand as MemberExpression; } if (memberExpression != null) { ParameterExpression parameterExpression = memberExpression.Expression as ParameterExpression; if (parameterExpression != null && parameterExpression.Name == propertyExpression.Parameters[0].Name) return memberExpression.Member.Name; } throw new ArgumentException("Invalid expression.", "propertyExpression"); } } 


Source: https://habr.com/ru/post/In149835/


All Articles