Dependency Properties

Probably not the most thrilling first post, but Dependency Properties are a big thing in WPF land.

A Dependency Property is a property that is registered with the Avalon Dependency property system. This is useful for 2 main reasons...

  • Backing your object property with a dependency property, allowing you to have support for databinding, styling, animation, default values, value expressions, property invalidations or inheritance. Examples include the Background or Fontsize property.
  • Creating attached properties. Attached properties are properties that can be set on ANY DependencyObject types. An example is the Dock property.

You can get the full low down on Dependency Properties here.

So, for reference, the code below shows how to create and register a Dependency Property within a class. The property is call 'MyNameProperty'. The code below declares and registers the Dependency property...

public

static readonly DependencyProperty MyNameProperty = DependencyProperty.Register("MyName", typeof(string), typeof(MyClass), new UIPropertyMetadata(MyClass.MyNameValueChanged));

This next piece of code now provides access to the property...

public

string MyName{

   get { return (string)GetValue(MyNameProperty); }

   set { SetValue(MyNameProperty, value); }

}

Finally, I add an event to listen for the value changing - for example, if the property is animated or databound... (where 'nameText' is a TextBlock displaying the value of MyName)

private

static void MyNameValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){

MyClass myClass = (MyClass)d;

myClass.nameText.Text = (

string)e.NewValue;

}

I can now use MyClass as a DataTemplate within an items control, binding MyName to a data context...

<

ItemsControl Name="nameList" ItemsSource="{Binding}">

<

ItemsControl.ItemTemplate>

<

DataTemplate>

<

local:MyClass MyName="{Binding Path=MyName}" />

</

DataTemplate>

</

ItemsControl.ItemTemplate>

</

ItemsControl>

And that is a brief intro to dependency properties. I am sure i will go deeper into these in the future as i encounter more and more uses for them.

Martin

Comments

  • Anonymous
    June 05, 2007
    Thanks this post was exactly what I was looking for. This worked perfectly!

  • Anonymous
    September 27, 2007
    It took me forever to find a post that explained this! I don't know why more intros to WPF don't cover it. Thank you for posting such a concise and understandable explanation of a somewhat mystifying feature of WPF.

  • Anonymous
    September 28, 2007
    I assume this class inherits from DependancyObject otherwise SetValue and GetValue have no meaning ???

  • Anonymous
    November 08, 2007
    SetValue and GetValue are inherited methods from e.g. UserControl which MyClass inherited from.

  • Anonymous
    February 10, 2008
    Okay, hello again. Let's go back to our People &amp; Groups Framework - right now I've reworked the solution,

  • Anonymous
    February 10, 2008
    Okay, hello again. Let&#39;s go back to our People &amp; Groups Framework - right now I&#39;ve reworked