Data Binding

kennyzkit Messages postés 3 Date d'inscription samedi 13 mai 2006 Statut Membre Dernière intervention 2 mai 2011 - 29 avril 2011 à 15:29
goast_tu Messages postés 212 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 28 mai 2011 - 28 mai 2011 à 18:00
Bonjour à tous,

je galère un peu avec WPF qui est nouveau pour moi. Voila ma question :

Je souhaite que certains item (MenuItem) n'apparaisse que si mon utilisateur à les droit d'admin (Définit dans une table MySQL ou que si un utilisateur est connecté ).

les droit d'admin sont défini par ma classe User qui a pour variable IdTypeUser. cette variable est accessible depuis ma MainWindow.

Donc dans mon xaml de mes fenetres je veux que tout les controls ayant par exemple un Style="{StaticResource uniquementAdmin}" ne soit visible par ces admins.

Je pense ne pas avoir très bine compris comment fonctionne le databinding a ce niveau.
Voila à ou j'en suis mais forcement ca ne marche pas... :

Une idée ?



<Style   x:Key="uniquementAdmin" TargetType="Control">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=isUserConnect}" Value="True"/>
                    <Condition Binding="{Binding Path=User.IdTypeUser}" Value="2"/>
                </MultiDataTrigger.Conditions>
                <Setter Property="Visibility" Value="Visible" />
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=isUserConnect}" Value="True"/>
                    <Condition Binding="{Binding Path=User.IdTypeUser}" Value="1"/>
                </MultiDataTrigger.Conditions>
                <Setter Property="Visibility" Value="Hidden" />
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=isUserConnect}" Value="True"/>
                    <Condition Binding="{Binding Path=User.IdTypeUser}" Value="3"/>
                </MultiDataTrigger.Conditions>
                <Setter Property="Visibility" Value="Hidden" />
            </MultiDataTrigger>
            <DataTrigger Binding="{Binding Path=isUserConnect}"  Value="False">
                <Setter Property="Visibility" Value="Hidden" />
            </DataTrigger>
        </Style.Triggers>
    </Style>


Merci !

5 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
29 avril 2011 à 21:10
salut,

Tu peux aussi utiliser un datatemplateselector
http://www.lelibre.net/index.php?post/2010/11/03/Template-conditionnel-d-une-listbox-WPF

Une utilisation avec les datatrigger
http://anders.janmyr.com/2007/09/combining-datatriggers-and-property.html

Bon dev.

Merci d'indiquer ou etait ton probleme.

<Style TargetType="{x:Type Button}">
 <Style.Triggers>
  <MultiDataTrigger>
   <MultiDataTrigger.Conditions>
    <!-- This binding refers to the actual WPF element. -->
    <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True"/>
    <Condition Binding="{Binding Path=Role}" Value="Admin"/>
   </MultiDataTrigger.Conditions>
   <Setter Property="Button.Background" Value="Orange" />
  </MultiDataTrigger>
 </Style.Triggers>
</Style>

0
kennyzkit Messages postés 3 Date d'inscription samedi 13 mai 2006 Statut Membre Dernière intervention 2 mai 2011
1 mai 2011 à 12:20
Merci pour ces liens ! Mais en fait ca m'aide pas trop... j'ai deja trouver ces liens avant et impossible de faire fonctionner !

Voila ce que j'ai comme code, et je ne comprends pas pourquoi mon menuItem ne s'affiche pas dès que ma variable isUserConnect = True :

Dans mon dictionnaire de style (ResourceDictionary)


<Style x:Key="uniquementAdmin" TargetType="Control">       
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=isUserConnect}"  Value="True">
                <Setter Property="Visibility" Value="Visible" />
            </DataTrigger>
</Style.Triggers>
    </Style>


Dans mon xaml de ma fenetre :

<MenuItem Header="_Utilisateur" Name="menuUtilisateur"  HorizontalAlignment="Center" VerticalAlignment="Center" Height="23" Margin="0" >
                <MenuItem Header="_Mes Paramètres" Name="menuMesParametres" Click="menuMesParametres_Click"  />
                <MenuItem  Header="_Gestion Utilisateurs" Name="menuGestionUtilisateur"   Style="{StaticResource uniquementAdmin}" Visibility="Collapsed"  />                
</MenuItem>


Et mon MainWindow .cs :

public partial class MainWindow : Window
   {

        private MySQLConnection sql = new MySQLConnection(false);
        public User user;
        public bool isUserConnect;

        public MainWindow()
        {
            isUserConnect = false;

            InitializeComponent();

            user = new User(this);           
        }
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
1 mai 2011 à 19:45
Et si tu mets isUserConnect en property à la place de variable public.
0
kennyzkit Messages postés 3 Date d'inscription samedi 13 mai 2006 Statut Membre Dernière intervention 2 mai 2011
2 mai 2011 à 09:35
Toujours rien avec ca... :


 private bool userConnected = false;
        public bool isUserConnect
        {
            get { return userConnected; }

            set { userConnected = value; }
        }


        public MainWindow()
        {
            isUserConnect = false;

            InitializeComponent();

            user = new User(this);


Je vais m'en tenir a une autre solution venant d'un autre forum :

Te baser sur un style pour savoir si tu dois afficher ou non ne me parait pas une bonne idée.
Tu devrais te baser sur un flag quelconque.
Regarde le pattern MVVM, il est très pratique : http://japf.developpez.com/tutoriels...-et-testables/
Une framework MVVM simple et pratique : http://www.galasoft.ch/mvvm/

Avec ça, tu pourra avoir dans ton VM un flag style isAdmin et tu pourras baser tes triggers dessus plutot.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
goast_tu Messages postés 212 Date d'inscription dimanche 3 avril 2005 Statut Membre Dernière intervention 28 mai 2011 2
28 mai 2011 à 18:00
Salut

<Style.Triggers>
<DataTrigger Binding="{Binding Path=isUserConnect}" Value="True">
<Setter Property="Visibility" Value="Visible" />
</DataTrigger>
</Style.Triggers>

Si mes souvenirs sont bon ceci ne devrait pas marcher car les DataTriggers ne sont autorisés que dans les DataTemplates.
Si non c'est sur que faire un contrôle de sécurité dans le style n'est pas correcte. En plus si tu comptes baser la sécurité de ton appli dessus ca peut poser des soucis. Car par exemple on peut changer la visibilité des éléments de l'interface avec snoop et du coups contourner ce genre de protections.
0
Rejoignez-nous