2011-04-25 3 views
1

Est-il possible d'associer des Datatrigger à un style lors de l'exécution? J'ai traversé mon code (non fonctionnel) plusieurs fois maintenant et je n'arrive pas à trouver où je me suis trompé.Association de DataTriggers à l'exécution

est ici la méthode que je l'utilise pour fixer le style et le déclencheur:

private void AttachVisibilityTrigger(Control ctrl) 
{ 
    Style stl = new System.Windows.Style(); 
    DataTrigger dt = new DataTrigger(); 
    PropertyInfo pi = _entity.GetType().GetProperty(this.SecondaryOptions[ctrl.Name]); 
    Type controlType = this.GetControlTypeForProperty(ref dt, pi); //gets the control type based on the property name and then sets the value for the DataTrigger for which I want the visibility to be hidden 
    Binding b = this.GetVisibilityBindingByControlType(controlType); //returns a new Binding with the appropriate Path set that corresponds to the bound property value (e.g IsChecked for CheckBoxes, Text for TextBoxes, SelectedValue for Comboboxes, etc) 

    b.ElementName = this.SecondaryOptions[ctrl.Name]; 
    dt.Binding = b; 
    dt.Setters.Add(new Setter(Control.VisibilityProperty, System.Windows.Visibility.Hidden)); 

    stl.Triggers.Add(dt); 
    ctrl.Style = stl; 
} 
+0

Pourquoi avez-vous besoin de faire cela? N'y a-t-il aucun moyen de le faire avec la modélisation de données? Aussi: Avez-vous parcouru le débogueur, est-ce que la réflexion fonctionne, est-ce que la liaison créée a du sens? –

+0

J'ai besoin de cela parce que j'ai une seule fenêtre qui gère la création de tous les nouveaux objets dans mon projet. Les contrôles de la fenêtre sont générés lors de l'exécution en fonction des types de données des propriétés de chaque objet. J'ai maintenant reçu une exigence pour empêcher l'entrée de certaines valeurs jusqu'à ce que d'autres valeurs aient d'abord été fournies. Par exemple, «La propriété a-t-elle été endommagée? Si oui, décrivez-la». J'ai donc une case à cocher pour la propriété booléenne IsDamaged et, si elle est cochée, je veux que la zone de texte liée à la propriété DamageDescription soit maintenant visible. –

+0

"une seule fenêtre qui gère la création de tous les nouveaux objets" qui semble assez étrange. Quoi qu'il en soit, comme je l'ai déjà noté, pouvez-vous confirmer que la création de la liaison fonctionne? Parce que le reste me semble correct et je ne sais pas quels objets et champs vous utilisez là-bas. –

Répondre

2

Je suis assez sûr que la liaison est juste cassé, j'ai créé des styles similaires dans le code et ils travaillent.

Surtout cette ligne semble tout à fait suspect:

b.ElementName = this.SecondaryOptions[ctrl.Name]; 

(Si vous voulez lier au contrôle lui-même utiliser RelativeSource à la place.)

Avez-vous vérifié la fenêtre de sortie de VisualStudio pour les erreurs de liaison ?