Dependency Property; cosa sono?
WPF viene fornito con alcuni servizi che estendono le proprietà CLR che vengono comunemente chiamate Dependency Properties. Una DP è una proprietà il cui valore dipende da sorgenti esterne, come animazioni, associazione dati (data binding), stili, o ereditarietà dell'albero visivo (visual tree inheritance). Non solo questo, ma una DP ha al suo interno anche la caratteristica di fornire una notifica quando la proprietà è cambiata, l'associazione dati è cambiata o lo stile è cambiato.
Proprietà CLR Property vs. Dependency Property
Una proprietà CLR legge direttamente dal membro privato della classe, i metodi Get() e Set() della classe recuperano ed archiviano i valori della proprietà. Mentre quando si setta un valore di una DependencyProperty non viene archiviato in un campo dell'oggeto, ma in un Dictionary di chiavi/valori fornito dalla classe base DependencyObject. La chiave di una entry è il medesimo nome della proprietà ed il valore è il valore che si vuole settare.
Vantaggi di una Dependency Property
Esempio
Per lavorare con una DP, si deve derivare dalla classe DependencyObject, come l'osservatore che include la nuova Property System è definito all'interno del DependencyObject. Realizziamo una semplice applicazione per la selezione di macchine.
XAML
<
Window
x
:
Class
="WpfApplication1.DependencyPropertyDemo"
xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns
:
x
="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns
:
local
="clr-namespace:WpfApplication1"
Title
="DependencyPropertyDemo"
Height
="150"
Width
="250">
<
Window.Resources
>
<
local
:
DependencyPropertySample
x
:
Key
="CarDependency" />
</
Window.Resources
>
<
Grid
>
<
Grid.RowDefinitions
>
<
RowDefinition
/>
<
RowDefinition
/>
</
Grid.RowDefinitions
>
<
Label
Content
="Enter Car:"
Grid.Row
="0"
VerticalAlignment
="Center" />
<
TextBox
Text
="{
Binding
Path
=MyCar,
Source
={
StaticResource
CarDependency }}"
Name
="MyTextCar"
Height
="25"
Width
="150"
HorizontalAlignment
="Right" />
<
Button
Name
="MyButton"
Content
="Click Me!"
Click
="MyButton_Click"
Height
="25"
Width
="150"
Grid.Row
="1" />
</
Grid
>
</
Window
>
Code Behind
public
class
CarDependencyProperty : DependencyObject
{
//Register Dependency Property
public
static
readonly DependencyProperty CarDependency = DependencyProperty.Register("MyProperty", typeof(string), typeof(DependencyPropertySample));
public
string MyCar
{
get
{
return (string)GetValue(CarDependency);
}
set
{
SetValue(CarDependency, value);
}
}
}
public
partial
class
CarDependencyPropertyDemo : Window
{
public CarDependencyPropertyDemo()
{
InitializeComponent();
}
private void MyButton_Click(object sender, RoutedEventArgs e)
{
CarDependency dpSample =
TryFindResource("CarDependency ") as CarDependency;
MessageBox.Show(dpSample.MyCar);
}
}
|