2010-10-01 25 views
5

J'ai une application WPF où j'utilise les propriétés de dépendance dans codebehind que je veux définir via les déclarations XAML.WPF: Les déclarations de propriétés XAML ne sont pas définies via Setters?

par exemple.

<l:SelectControl StateType="A" Text="Hello"/> 

Ainsi, dans cet exemple, j'ai un UserControl appelé SelectControl, qui a une propriété appelée StateType qui manipulent d'autres propriétés dans son setter.

Pour aider à illustrer le problème, j'ai mis une autre propriété appelée Text dans l'exemple, lisez la suite et je vais vous expliquer plus loin.

Extrait Codebehind ...

public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(String), typeof(SelectControl)); 

public String Text 
{ 
    get { return (String)GetValue(TextProperty); } 
    set { SetValue(TextProperty, value); } 
} 

public static readonly DependencyProperty StateTypeProperty = DependencyProperty.Register("StateType", typeof(String), typeof(SelectControl)); 

public String StateType 
{ 
    get { return (String)GetValue(StateTypeProperty) } 
    set 
    { 
     switch (value) 
     { 
     case "A": 
      AnotherPropertyBoolean = true; 
      break; 
     case "B": 
      AnotherPropertyBoolean = false; 
      break; 
     default: 
     // this is only an example... 
     } 
    } 
} 

Maintenant, si je mets un point d'arrêt sur le poseur (soit pour StateType ou Text), il se révèle qu'il n'a jamais exécuté.

Cependant les valeurs déclarées pour Text, à savoir « Bonjour » apparaît dans ses données liées TextBox, et bien sûr, je lier un autre contrôle de texte à la valeur de StateType je peux voir aussi.

Est-ce que quelqu'un sait ce qui se passe?

Répondre

13

Les "wrappers CLR" pour les propriétés de dépendance ne sont appelés que lorsqu'ils sont effectués par le biais du code. XAML dépend du nom spécifié dans l'appel DependencyProperty.Register (...). Ainsi, au lieu d '"étendre" la logique du setter pour votre propriété de dépendance comme vous l'avez fait ci-dessus, mettez simplement votre logique personnalisée dans une fonction PropertyChangedCallback.

+0

Nice one :) merci. – ocodo