- WPF introduces a new type of property called Dependency Property.
- This Property is backed by WPF property system.
- It is used for animation; enable styling, automatic data binding and more.
- It depends upon multiple providers for determining its value at any point of time.
- The biggest feature of Dependency Property is it’s built in ability to provide CHANGE NOTIFICATION.
- Main motive behind adding Dependency Property is to enable rich functionality directly from declarative markup language.
- 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).
- Local Value
- Style Triggers
- Template Triggers
- Style setters
- Theme Style Triggers
- Theme Style Setters
- Property Value Inheritance
- 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
- Change Text color of Button with Mouse Hover.
- When Mouse Enters, text color should be change to BLUE
- 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>