2010-04-05 2 views
2

Je ne sais pas pourquoi la propriété est pas appelé liaison. Voici le code:Pourquoi la propriété n'est pas appelée lors de la liaison dans WPF?

<myusercontrol 
Text ="{Binding Description, UpdateSourceTrigger=LostFocus,Mode=TwoWay, ValidatesOnDataErrors=True}" 
IsReadOnly ="{Binding AllowEditing}" 
/> 

Et voici la MyUserControl propriété IsReadOnly:

public static DependencyProperty IsReadOnlyProperty = DependencyProperty.Register("IsReadOnly", typeof (bool), 
                          typeof (
                           myusercontrol)); 


     public bool IsReadOnly 
     { 
      get 
      { 
       return ((bool) GetValue(IsReadOnlyProperty)); 
      } 

      set 
      { 
       MessageBox.Show(value.ToString()); 
       SetValue(IsReadOnlyProperty, !value); 
       OnPropertyChanged("IsReadOnly"); 
      } 
     } 

La boîte de message est jamais affiché! Des idées!

Répondre

5

Vous ne devriez jamais mettre de logique dans vos getters et setters de propriété de dépendance sauf pour les appels GetValue et SetValue. Ceci est très important, car la liaison XAML ira directement à travers les GetValue et SetValue appels, non pas par votre code derrière la propriété! C'est pourquoi vous ne voyez jamais le MessageBox. Une meilleure approche consiste à ajouter une méthode de rappel en utilisant la méthode DependencyProperty.Register (il y a une surcharge pour ajouter un rappel). Ensuite, cette méthode sera appelée chaque fois que la valeur change, et vous pouvez y placer votre logique.

Une autre question- pourquoi vous utilisez OnPropertyChanged? Les propriétés de dépendance ont vous ne devriez jamais avoir la notification de modification intégrées, pour appeler OnPropertyChanged pour eux.

+0

J'ai utilisé le rappel, mais même le rappel n'est pas déclenchée. – azamsharp

+0

Etes-vous sûr que la reliure fonctionne alors? Votre fenêtre de sortie a-t-elle des erreurs de liaison? Essayez – Charlie

+0

pour le débogage de la liaison: diag: PresentationTraceSources.TraceLevel = Haut, où diag est définie comme l'espace de noms System.Diagnostics. – Charlie

Questions connexes