2010-11-30 24 views
0

Je suis en train une propriété de dépendance en XAML (Silverlight 4):Silverlight: Quand une propriété de dépendance est-elle disponible?

<my:TopSearchBar x:Name="topSearchBar" Grid.Row="0" Navigator="{Binding ElementName=navigationFrame}" HorizontalAlignment="Stretch" VerticalAlignment="Top" /> 

Je dois vous inscrire à certains événements de navigation du navigationFrame. Toutefois, le suivant échoue avec une exception de pointeur null:

public TopSearchBar() 
    { 
     // Required to initialize variables 
     InitializeComponent(); 

     Loaded += new RoutedEventHandler(TopSearchBar_Loaded); 
    } 

    void TopSearchBar_Loaded(object sender, RoutedEventArgs e) 
    { 
     // Navigator is null 
     Navigator.Navigated += new NavigatedEventHandler(Navigated); 
    } 

Quel est le moment approprié pour enregistrer ces gestionnaires d'événements? J'ai essayé de le faire dans le setter de propriété, mais jamais été touché breakpoint:

public Frame Navigator 
    { 
     get { return GetValue(NavigatorProperty) as Frame; } 
     set { SetValue(NavigatorProperty, value); } 
    } 

Répondre

2

Manchettes ne pas utiliser la propriété Navigator. Au lieu de cela, la classe de liaison accède directement au champ NavigatorProperty, de type DependencyProperty, et définit la valeur.

Dans votre code, vous pouvez faire un OverrideMetadata sur l'objet NavigatorProperty. Créez un PropertyMetadata qui inclut un PropertyChangedCallback et ajoutez le gestionnaire d'événements à cet endroit. Sachez simplement que OverrideMetadata fonctionne sur toutes les instances du type que vous spécifiez, spécifiez donc le plus bas dont vous avez besoin (TopSearchBar, probablement), et soyez prudent.

DependencyProperty.OverrideMetadata Method