#574 – Complete Example of Implementing a Dependency Property
June 6, 2012 4 Comments
Recall that you can implement a dependency property if your class inherits from DependencyObject. Here is a complete example, showing how to implement a dependency property.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows; // Remember to reference WindowsBase
namespace PersonDLL
{
public class Person : DependencyObject
{
// Classic CLR properties
public string Name { get; set; }
public bool AARPCandidate { get; set; }
// Age is a dependency property
public static readonly DependencyProperty AgeProperty;
// Call methods in DependencyObject to read/write property values
public int Age
{
get { return (int)GetValue(AgeProperty); }
set { SetValue(AgeProperty, value); }
}
// Static constructor sets everything up
static Person()
{
PropertyMetadata ageMetadata =
new PropertyMetadata(
18, // Default value
new PropertyChangedCallback(OnAgeChanged),
new CoerceValueCallback(OnAgeCoerceValue));
// Register the property
AgeProperty =
DependencyProperty.Register(
"Age", // Property's name
typeof(int), // Property's type
typeof(Person), // Defining class' type
ageMetadata, // Defines default value & callbacks (optional)
new ValidateValueCallback(OnAgeValidateValue)); // validation (optional)
}
// Value has changed
private static void OnAgeChanged
(DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
Person p = (Person)depObj;
p.AARPCandidate = (int)e.NewValue > 60 ? true : false;
}
// Allow coercing value being set
private static object OnAgeCoerceValue
(DependencyObject depObj, object baseValue)
{
int coercedValue = (int)baseValue;
if ((int)baseValue > 120)
coercedValue = 120;
if ((int)baseValue < 1)
coercedValue = 1;
return coercedValue;
}
// Validate a value beint set
private static bool OnAgeValidateValue(object value)
{
int age = (int)value;
// Only allow reasonable ages
return (age > 0) && (age < 120);
}
}
}