2010-04-20 6 views
0

J'ai créé deux UserControls, un ValidationManager et un ValidationOutput. Sur un formulaire donné, il y a un contrôle ValidationManager et plusieurs contrôles ValidationOutput, un pour chaque contrôle validé. Le ValidationManager reçoit une liste d'erreurs de validation lorsque le formulaire est soumis. Je veux que chaque contrôle ValidationOutput regarde cette liste et vérifie s'il y a des erreurs pertinentes.Transférer la référence WPC UserControl à un autre UserControl

Le code ressemble un peu à ceci:

<r:ValidationManager x:Name="myValidationManager" /> 
... 
<TextBox Name="SomeField" /> 
<r:ValidationOutput FieldName="SomeField" /> 

Je dois passer une référence à la ValidationManager à chacun des contrôles ValidationOutput. J'ai ajouté une propriété ValidationManager à l'objet ValidationOutput UserControl, mais je ne sais pas comment transmettre la référence au contrôle. Je l'ai essayé ce qui suit, mais je suis juste agrippant pailles:

<r:ValidationOutput ValidationManager="myValidationManager" /> 
...and... 
<r:ValidationOutput ValidationManager="{Binding myValidationManager}" /> 

Les premiers résultats dans une erreur « Propriété « ValidationManager » n'a pas été trouvé ou non sérialisable pour le type « ValidationOutput » » et le second « A ' La 'liaison' ne peut pas être définie sur la propriété 'ValidationManager' du type 'ValidationControl'. Une 'liaison' ne peut être définie que sur une DependencyProperty d'un DependencyObject. "

+0

c'est le cas parfait pour MVVM. Passer des références aux contrôles autour peut devenir vraiment salissant. Si vous retournez la vue parent avec un ViewModel comme DataContext, les vues enfant peuvent hériter du DataContext et simplement se lier aux propriétés de votre ViewModel ou les ViewModels (qui sont des classes CLR régulières et non des contrôles WPF) peuvent effectuer la communication de manière beaucoup plus propre . Si vous n'êtes pas familier avec MVVM, Lab49 a fait une très bonne vidéo sur le sujet il y a quelques temps et c'est toujours très pertinent: http://blog.lab49.com/archives/2650 http://www.lab49.com/files /videos/Jason%20Dolinger%20MVVM.wmv – Rich

+0

Merci Rich, cela semble très utile et beaucoup plus propre, mais pour ce projet, nous sommes coincés avec l'architecture existante, donc je suis à la recherche d'une solution "bolt-on". –

Répondre

1

Il devrait être possible d'utiliser un StaticResource pour affecter le ValidationManager à vos propriétés:

<r:ValidationOutput ValidationManager="{StaticResource myValidationManager}" /> 

Cependant, la conception me semble étrange. Peut-être que vous devriez mieux utiliser MVVM comme Rich l'a souligné dans son commentaire.

+0

L'utilisation de StaticResource me donne l'erreur "Property 'ValidationManager" n'a pas été trouvé ou n'est pas sérialisable pour le type' ValidationOutput '". Des idées? –

+0

Re ce qui précède, voici comment j'expose la propriété (pardon pour le formatage): public ValidationManager ValidationManager {set {_validationManager = value; _validationManager.ValidationComplete + = ValidationManager_ValidationComplete; }} –

+0

Hmmm, cela semble être un problème de concepteur. Le code compile et fonctionne, n'est-ce pas ?! Je ne connais pas la raison de cette erreur, alors peut-être que vous devriez google pour cela, ou commencer une autre question ici. – gehho

Questions connexes