Od strony języka DP są propertiesami, budowanymi w dość nietypowy sposób. Należy dodać do klasy kontrolki statyczne publiczne pole tylko do odczytu, gdzie nazwa to nazwa property z dodanym "Property". Następnie w statycznym konstruktorze rejestruje się DP za pomocą metody DependencyProperty.Register. Przez parametry tej metody można określić domyślną wartość i metodę wołaną przy zmianie wartości. Można także zdefiniować pewien "wrapper", który będzie opakowywał ustawianie i odczyt wartości DP.
W poniższym przykładzie dla kontrolki tykającego zegarka zdefiniowano Dependency Property Ticks, które reprezentuje liczbę uderzeń zegarka.
public partial class TickingTimer : UserControl { public static readonly DependencyProperty TicksProperty; public int Ticks { get { return (int)GetValue(TickingTimer.TicksProperty); } set { SetValue(TickingTimer.TicksProperty, value); } } static TickingTimer() { TickingTimer.TicksProperty = DependencyProperty.Register("Ticks", typeof(int), typeof(TickingTimer), new FrameworkPropertyMetadata(0, new PropertyChangedCallback(OnTicksChanged))); } private static void OnTicksChanged(DependencyObject o, DependencyPropertyChangedEventArgs eventArgs) { Console.Beep(); } //LOGIKA KONTROLKI }
Kontrolkę taką można dodać do okna i zbindować się do naszego Dependency Property Ticks.
<Window x:Class="Dependency_Property.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Dependency_Property="clr-namespace:Dependency_Property" Title="MainWindow" Height="350" Width="525"> <Grid> <Dependency_Property:TickingTimer x:Name="Timer" Ticks="5" /> <Label Content="{Binding ElementName=Timer, Path=Ticks}" /> </Grid> </Window>
Brak komentarzy:
Prześlij komentarz