Sunday, December 22, 2013

Dependency Properties' key features

In progress...


The purpose of dependency properties is to provide a way to compute the value of a property based on the value of other inputs.

Main features:
Reduced memory footprint
  90% of the properties of a UI control typically stay at its initial values
  The default values are stored once within the dependency property.
Value inheritance
  Value resolution strategy.
    If no local value is set, the dependency property navigates up the logical tree until it finds a value.
  Not good practice cause performance impact.
  The main example is the DataContext.
  Property value inheritance is not the default property system behavior; a property must be established with a particular metadata setting in order to cause that property to initiate property value inheritance on child elements.
Change notification
  used by the databinding
  used by a custom logic

Details:
Value Precedence
  ...
Metadata Overrides
   Call in a constructor the AnyProperty.OverrideMetadata(...)
Pattern (creating)
  Inheritance from the DependencyObject that defines a key, value dictionary that contains local values.
    DependencyObject class, do not natively support INotifyPropertyChanged.
  DependencyProperty.Register() with yours static field.
  A name must always end up with Property - naming convention.
  A property wrapper with no logic.
    XAML ignores the wrapper and calls directly the DependencyObject's SetValue, GetValue.
  propdp - the shortcut initiator in VS.
  Callbacks
    Value Changed Callback
    Coerce Value Callback
      Correction of a new value without throwing an exception
    Validation Callback
      ArgumentException
  Readonly DependencyProperties
    private static readonly DependencyPropertyKey MyPropertyKey = DependencyProperty.RegisterReadonly(...)
    public static readonly DependencyProperty MyProperty =  MyPropertyKey.DependencyProperty;
    public int My
    {
       get { return (bool)GetValue(MyProperty); }
       private set { SetValue(MyPropertyKey, value); }
    }
  Attached Properties
    DependencyProperty.RegisterAttached
    GetPropertyName and SetPropertyName static methods.
    Has no wrapper in an instance.
Attach to events of defined properties
DependencyPropertyDescriptor
  DependencyPropertyDescriptor textDescr = DependencyPropertyDescriptor.FromProperty(TextBox.TextProperty, typeof(TextBox));
  textDescr.AddValueChanged(myTextBox, delegate
How to clear a local value
  DependencyProperty.UnsetValue
  button1.ClearValue( Button.ContentProperty );
Safe Constructor Patterns for DependencyObjects.

Literature
  MSDN
  http://wpftutorial.net/DependencyProperties.html

No comments:

Post a Comment