2010-08-05 18 views
1

Nous avons une exigence plutôt étrange: La visibilité de tout contrôle dans notre application WPF doit être pilotée par une table de base de données.WPF: Contrôler la visibilité à partir de la base de données/Prerender Hook

Cela signifie que nous avons une table qui stocke le nom de l'élément et sa visibilité.

Maintenant, je suis à la recherche d'une manière élégante d'implémenter cette fonctionnalité du côté client.

Je pourrais créer mon propre UserControl et en hériter partout, en fournissant une méthode Template InitializeComponent. Mais que se passe-t-il si quelqu'un ajoute par programmation plus de contrôles enfants?

Je ne veux pas que mes commandes soient au courant de ce mécanisme. Je veux accrocher/intercepter à un certain point (pré-contrôle-rendu) et ajuster la visibilité du contrôle en fonction de la base de données.

Est-ce que c'est en quelque sorte possible? Et sinon, comment le concevez-vous?

Répondre

0

Voici donc ce que je faisais:

j'ai hérité de UserControl et mettre le chèque dans le un gestionnaire d'événements pour l'événement Loaded.

Je laisse ensuite mes contrôles hériter de mon CustomControl, cela fonctionne plutôt bien.

L'implémentation FindName() ne trouvera pas les FrameworkElements pour une raison que je ne connais pas, bien que leurs noms soient définis dans le xaml. Voici donc la routine que j'utilise pour trouver les enfants par leur nom:

public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) 
     { 
      var child = VisualTreeHelper.GetChild(parent, i); 
      string controlName = child.GetValue(Control.NameProperty) as string; 

      if (controlName == name) 
      { 
       return child as T; 
      } 
      else 
      { 
       T result = FindVisualChildByName<T>(child, name); 
       if (result != null) 
       { 
        return result; 
       } 
      } 
     } 

     return null; 
    } 

Je n'aime pas cette solution, mais il fonctionne.