Dependency Property in XAML


  1. WPF introduces a new type of property called Dependency Property. 
  2. This Property is backed by WPF property system. 
  3. It is used for animation; enable styling, automatic data binding and more. 
  4. It depends upon multiple providers for determining its value at any point of time.
  5. The biggest feature of Dependency Property is it’s built in ability to provide CHANGE NOTIFICATION. 
  6. Main motive behind adding Dependency Property is to enable rich functionality directly from declarative markup language. 
  7. The purpose of Dependency Property is to find value of property based on the value of other inputs.

The other input might be

  • Style Themes 
  • User Preferences 
  • Just in time property determination 
  • Animation etc.

Example:

There are 96 public properties of Button. Properties can be easily set in XAML without any procedural code. But without extra plumbing of Dependency Property, it would be hard for the simple action of setting properties to get the desired result without writing extra code.

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

Backing Object Property with Dependency Property , allowing to have support for Data Binding, Animation, Default Value,  Styling etc.

Dependency Property supports Multiple Providers.  In order to get final value of Dependency Property, these five steps have been run by WPF.

Step 1:  Determine Base Value

The following provider set the base value for Dependency Property. They are here listed in order of their precedence (Highest to Lowest).

  1. Local Value 
  2. Style Triggers 
  3. Template Triggers 
  4. Style setters 
  5. Theme Style Triggers
  6. Theme Style Setters 
  7. Property Value Inheritance 
  8. Default value.

Step 2:  Evaluate

If the value from Step1 is an expression, then it is finally getting evaluated here.  WPF converts an expression into a concrete value.

Step 3: Apply Animation

If any animations are running they can either replace or alter the value of Dependency Property.

Step 4: Coerce

WPF takes final Property value and pass it to CorecevalueCallBack delegate. This is to check, whether any custom logic is running to set the value of Dependency Property. The callback is responsible for returning new value based on custom logic.

Step 5: Validate

Now final value is passed to ValidateValueCallBack delegate to check value is Valid or not.

Example of Dependency Property

Let, there is a requirement to

  1. Change Text color of Button with Mouse Hover. 
  2. When Mouse Enters, text color should be change to BLUE 
  3. When Mouse Leaves, text color changed back to BLACK.

So without special feature CHANGE NOTIFICATION of Dependency Property

Step 1: Create XAML tag for Button with two events , like below

<Window x:Class="WpfApplication2.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

      

   

    Title="Window1" Loaded="Window_Loaded"  Height="300" Width="300">

    <Grid>

        <Button MouseEnter="Button_MouseEnter" MouseLeave="Button_MouseLeave"  Height="100" Width="100"> Testing Button </Button>

    </Grid>

</Window>

Here Button_MouseEnter  and  Button_MouseLeave  is events.

Step 2: Now there is need to write code at back end to handles these events. Code will look like as follows

private void Button_MouseEnter(object sender, MouseEventArgs e)

        {

 

            Button b = sender as Button;

            if (b != null)

            {

                b.Foreground = Brushes.Blue;

            }

        }

 

        private void Button_MouseLeave(object sender, MouseEventArgs e)

        {

            Button b = sender as Button;

            if (b != null)

            {

                b.Background = Brushes.Black;

            }

 

        }

Now to achieve above task, XAML can be easily used with Dependency Property.

<Window x:Class="WpfApplication2.Window1"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"      

        Title="Window1" Loaded="Window_Loaded"  Height="300" Width="300">

    <Grid>

        <Button  Height="100" MinWidth="75" Margin="10">

            <Button.Style>

                <Style TargetType="{x:Type Button}">

                    <Style.Triggers>

                        <Trigger Property="IsMouseOver" Value="True">

                            <Setter Property="Foreground" Value="Blue"/>

                        </Trigger>

                    </Style.Triggers>

                </Style>

            </Button.Style>

            OK

        </Button>

    </Grid>

</Window>

Up Next
    Ebook Download
    View all
    Learn
    View all