2010-12-01 32 views
3

Je dois transmettre le nom des contrôles à une méthode dans un objet de sécurité qui renvoie une valeur booléenne pour la propriété IsEnabled et une autre méthode qui renvoie sa visibilité (réduite, masquée ou visible). Ces deux doivent être vérifiés pour les autorisations.Liaison de boutons IsEnabled/Propriétés de visibilité à l'aide de x: Nom en tant que paramètre d'une méthode dans le code-behind

J'ai essayé d'utiliser un objet ObjectDataProvider mais tous les exemples montrent seulement l'entrée d'utilisateur d'une zone de texte pour les paramètres. J'ai spécifiquement besoin de passer un nom de contrôle à la méthode basée sur la propriété x: Name du bouton.

Quelle est la manière la plus simple et la plus efficace de gérer ce problème? Merci d'avance.

MISE À JOUR: Je suis en train d'utiliser un convertisseur et c'est la méthode de conversion, je suis venu avec:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (values != null) 
     { 
      DataTable tblPermissions = (DataTable)values[0]; 
      string sFunctionName = values[1].ToString(); 

      DataRow[] rows = tblPermissions.Select("fun_name = '" + sFunctionName + "'"); 
      if ((bool)rows[0]["fun_enable"]) 
       return true; 
      else 
       return false; 
     } 

     return string.Empty; 
    } 

Voici le XAML:

    <Button.IsEnabled> 
         <MultiBinding Converter="{StaticResource IsFunctionEnabledConverter}"> 
          <Binding ElementName="{StaticResource PermissionsTable}" /> 
          <Binding ElementName="btnSave" Path="Name" /> 
         </MultiBinding> 
        </Button.IsEnabled> 

Répondre

2

Vous pouvez écrire un IValueConverter pour faire l'appel de méthode et de passer dans le contrôle lui-même en utilisant {Binding RelativeSource={RelativeSource Self}, Converter={StaticResource MyConverter}}. Dans la méthode Convert vous pouvez ensuite convertir la valeur en contrôle et accéder à la propriété Nom du contrôle pour passer à la méthode de sécurité. En vérifiant le targetType, vous pouvez déterminer s'il faut générer un booléen (pour IsEnabled) ou un enum de visibilité.

*** MISE À JOUR

Je suppose que la ressource « PermissionTable » utilisé avec votre convertisseur de liaison est en fait le DataTable, mais vous essayez de l'utiliser comme une chaîne pour identifier un élément par son nom comme la source de liaison . Essayez d'utiliser Source="{StaticResource PermissionsTable}" à la place pour transmettre la ressource DataTable elle-même.

+0

J'ai essayé d'utiliser un convertisseur, le problème que j'ai rencontré est que le convertisseur avait besoin que je passe dans l'objet de sécurité pour accéder aux permissions. J'ai créé un convertisseur à valeurs multiples qui utilise le nom du contrôle et la table pour les autorisations. Je reçois cette erreur lorsque j'essaie d'utiliser le convertisseur: "Impossible de lancer l'objet de type 'System.Data.DataTable 'to type' System.String '. " – jes9582

+0

Cela ressemble à un problème avec le code de votre convertisseur en tirant les éléments des valeurs [] dans le mauvais ordre mais je ne peux pas dire exactement quoi sans voir le code –

+0

J'ai posté un échantillon de code dans la question originale, laissez-moi savoir si vous voyez quelque chose de mal, mais ils devraient être dans le bon ordre Merci! – jes9582

0

Il peut y avoir différentes façons d'aborder ce problème en fonction de la façon dont vous avez architecturé votre application. Si vous utilisez des vues de contrôle utilisateur et en fonction du code, derrière votre itinéraire le plus facile, vous pouvez appeler les méthodes de l'objet de sécurité directement à partir du code et définir les propriétés directement sur les contrôles en question.

Si vous utilisez MVVM ou si vous n'êtes pas fan du code-behind, vous pouvez contourner ce problème en utilisant le nom du bouton et en choisissant un attached property. Les propriétés attachées sont un moyen d'utiliser l'infrastructure de propriété de dépendance WPF pour stocker des données sur un objet ou un contrôle que l'objet ou le contrôle ne s'est pas déclaré à l'origine.

Avec les propriétés attachées vient un concept appelé comportements attachés. Essentiellement, lorsque vous créez une propriété jointe, vous recevez un hook pour un rappel qui est appelé chaque fois que la propriété est définie sur un objet. Lorsque ce rappel est appelé, vous recevez l'objet sur lequel la propriété a été définie ainsi que les valeurs nouvelles et anciennes de la propriété.

Vous pouvez utiliser le rappel comme une opportunité pour vérifier la valeur de la propriété par rapport à votre objet de sécurité et définir les propriétés activées et visibles comme bon vous semble.

- HTH Dusty