IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Style, Triggers, Dependency Properties : pour un UserControl


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 62
    Points : 43
    Points
    43
    Par défaut Style, Triggers, Dependency Properties : pour un UserControl
    Bonjour,

    Voila j'essais de faire un UserControl avec un style contenant un triggers.

    Probleme quand j'applique le style a mon userControl il me dis :
    JMBSearchControl' TargetType does not match type of element 'UserControl'.

    Le but de ce style c'est que si l'utilisateur referencie la propriete DisplayDataAtOpening a 1, la proprieter VResultVisibility sera Visible et a Collapsed si DisplayDataAtOpening est a 0. Ensuite la ligne en rouge de mon xaml sera binder sur VResultVisibility.

    Est-ce que quelqu'un peut me dire ce qui ne va pas dans mon code S'il vous plait?

    Aussi la proprieter est de type int. Idealement j'aimerais qu'elle soit de type bool mais il semblerait avoir un probleme avec les dependency properties et les bool de ce que j'ai pu lire sur une discussion du forum. Mais bon ceci est un tous petit détails. La question principal est : C'est quoi qui cloche dans mon style ou mon usercontrol?

    Merci Beaucoup.


    xaml du userControl.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <UserControl  x:Class="JMB.FRAMEWORK.WPF.UserControls.JMBSearchControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:jmb="clr-namespace:JMB.Framework.WPF;assembly=JMB.Framework.WPF"
        xmlns:jmbGrid="http://schemas.microsoft.com/wpf/2008/toolkit"
        xmlns:local="clr-namespace:JMB.FRAMEWORK.WPF.UserControls"
        Height="544"  Width="422" Style="{DynamicResource TriggerStyle}">
        <UserControl.Resources>
            <Style x:Key="TriggerStyle" TargetType="{x:Type local:JMBSearchControl}">
                <Style.Triggers>
                    <Trigger Property="DisplayDataAtOpening" Value="1">
                        <Setter Property="VResultVisibility" Value="Visible"/>
                    </Trigger>
                    <Trigger Property="DisplayDataAtOpening" Value="0">
                        <Setter Property="VResultVisibility" Value="Collapsed"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </UserControl.Resources>
         
        <!--Definition du controle-->
        <Grid Width="379" Height="507" Name="_grdMain">
                <StackPanel Orientation="Vertical">
                    <jmb:View jmb:ViewItem.LabelPadding="3" 
                                  jmb:ViewItem.LabelPosition="Left" 
                                  Name="vSearch" Height="150" 
                                  MinHeight="32.35" MinWidth="365" 
                                  Width="371" 
                                  Margin="3.2,10,14.5,0" 
                                  VerticalAlignment="Top"
                                  jmb:ViewItem.ContentPadding="2"
                                  >
                        <jmb:View.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Vertical"></StackPanel>
                            </ItemsPanelTemplate>
                        </jmb:View.ItemsPanel>
                        <TextBox Name="txtSearch1" TextChanged="txtSearch1_TextChanged"  Height="25" Width="290" jmb:ViewItem.LabelContent="Critère1"/>
                        <TextBox Name="txtSearch2"   Height="25" Width="290" jmb:ViewItem.LabelContent="Critère1"/>
                        <TextBox Name="txtSearch3"   Height="25" Width="290" jmb:ViewItem.LabelContent="Critère1"/>
                        <TextBox Name="txtSearch4"   Height="25" Width="290" jmb:ViewItem.LabelContent="Critère1"/>
                        <Button  Click="btnSearch_Click"  Name="btnSearch" Width="25" Height="25" IsEnabled="False"></Button>
                    </jmb:View>
                    <jmb:View Margin="0,5"
                              Name="vResult" 
                              Height="335" Width="369" Visibility="{Binding Path=VResultVisibility}">                
                    <ListView Margin="0,5" Name="lstResult" Width="369" Height="327" MinHeight="327" MinWidth="369">
                            <ListView.View>
                                <GridView>
                                    <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Path=ENTITEMD_ID}"></GridViewColumn>
                                    <GridViewColumn Header="NOM TABLE DB" DisplayMemberBinding="{Binding Path=ENTITEMD_NOM_TABLE_DB}"></GridViewColumn>
                                    <GridViewColumn Header="Definition L01" DisplayMemberBinding="{Binding Path=ENTITEMD_DEFINITION_L01}"></GridViewColumn>
                                </GridView>
                            </ListView.View>
                        </ListView>
                    </jmb:View>
            </StackPanel>
        </Grid>
    </UserControl>
    Le code behind pour les dependency properties

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    /// <summary>
                    /// Doit on afficher les données a l'ouverture du control
                    /// ou doit on attendre que l'utilisateur 
                    /// effectue une recherche
                    /// </summary>
                    public int DisplayDataAtOpening
                    {
                        get { return (int)GetValue(DisplayDataAtOpeningProperty); }
                        set { SetValue(DisplayDataAtOpeningProperty, (int)value); }                    
                    }
                    public static DependencyProperty DisplayDataAtOpeningProperty = DependencyProperty.Register("DisplayDataAtOpening", typeof(int), typeof(JMBSearchControl));
     
    public Visibility VResultVisibility
                    {
                        get
                        {
                            return (Visibility)GetValue(VResultVisibilityProperty);
                        }
                        set
                        {
                            SetValue(VResultVisibilityProperty, (Visibility)value);
                        }
                    }
                    public static DependencyProperty VResultVisibilityProperty = DependencyProperty.Register("VResultVisibility", typeof(Visibility), typeof(JMBSearchControl));
    Pascal Wick
    Programmeur-Analyste Sr.
    Groupe OnePoint
    Pascal Wick
    Programmeur-Analyste Sr.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 62
    Points : 43
    Points
    43
    Par défaut Est-ce un pas en avant ou un pas en arriere
    Alors voilà je n'ai toujours pas trouver de solution a mon problème mais j'ai quand meme fait une modification pour essayer de faire fonctionner mon truc en me basant sur un exemple. Resultat ce n'est plus l'erreur
    • JMBSearchControl' TargetType does not match type of element 'UserControl'.


    mais cette erreur

    • Verify that the owning type is the Style's TargetType, or use Class.Property syntax to specify the Property


    la nature de mes modification sont les suivante. Il y a juste le xaml qui a changer.

    • Premierement j'ai retirer mon style des ressources du UserControl et je n'affecte plus le style en passant par <UserControl ... Style ="{DynamicResource TriggerStyle}" ... >
    • Par la suite j'ai nommer mon usercontrol comme suit <UserControl ... Name ="UC" ... >
    • Et puis j'ai ajouter mon style comme suit :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      <UserControl.Style>
              <Style TargetType="{x:Type local:JMBSearchControl}">
                  <Style.Triggers>
                      <Trigger Property="UC.DisplayDataAtOpening" Value="1">
                          <Setter Property="UC.VResultVisibility" Value="Visible"/>
                      </Trigger>
                      <Trigger Property="UC.JMBSearchControl.DisplayDataAtOpening" Value="0">
                          <Setter Property="UC.VResultVisibility" Value="Collapsed"/>
                      </Trigger>
                  </Style.Triggers>
              </Style>
          </UserControl.Style>


    Voici le xaml complet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    <UserControl  x:Class="JMB.FRAMEWORK.WPF.UserControls.JMBSearchControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:jmb="clr-namespace:JMB.Framework.WPF;assembly=JMB.Framework.WPF"
        xmlns:jmbGrid="http://schemas.microsoft.com/wpf/2008/toolkit"
        xmlns:local="clr-namespace:JMB.FRAMEWORK.WPF.UserControls"
        Height="544" Name="UC" Width="422" >
        <UserControl.Style>
            <Style TargetType="{x:Type local:JMBSearchControl}">
                <Style.Triggers>
                    <Trigger Property="UC.DisplayDataAtOpening" Value="1">
                        <Setter Property="UC.VResultVisibility" Value="Visible"/>
                    </Trigger>
                    <Trigger Property="UC.JMBSearchControl.DisplayDataAtOpening" Value="0">
                        <Setter Property="UC.VResultVisibility" Value="Collapsed"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </UserControl.Style>
     
        <!--Definition du controle-->
        <Grid Width="379" Height="507" Name="_grdMain">
                <StackPanel Orientation="Vertical">
                    <jmb:View jmb:ViewItem.LabelPadding="3" 
                                  jmb:ViewItem.LabelPosition="Left" 
                                  Name="vSearch" Height="150" 
                                  MinHeight="32.35" MinWidth="365" 
                                  Width="371" 
                                  Margin="3.2,10,14.5,0" 
                                  VerticalAlignment="Top"
                                  jmb:ViewItem.ContentPadding="2"
                                  >
                        <jmb:View.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Vertical"></StackPanel>
                            </ItemsPanelTemplate>
                        </jmb:View.ItemsPanel>
                        <TextBox Name="txtSearch1" TextChanged="txtSearch1_TextChanged"  Height="25" Width="290" jmb:ViewItem.LabelContent="Critère1"/>
                        <TextBox Name="txtSearch2"   Height="25" Width="290" jmb:ViewItem.LabelContent="Critère1"/>
                        <TextBox Name="txtSearch3"   Height="25" Width="290" jmb:ViewItem.LabelContent="Critère1"/>
                        <TextBox Name="txtSearch4"   Height="25" Width="290" jmb:ViewItem.LabelContent="Critère1"/>
                        <Button  Click="btnSearch_Click"  Name="btnSearch" Width="25" Height="25" IsEnabled="False"></Button>
                    </jmb:View>
                    <jmb:View Margin="0,5"
                              Name="vResult" 
                              Height="335" Width="369" Visibility="{Binding Path=VResultVisibility, ElementName=ctl}">
                    <!--Visibility="{Binding Path=VResultVisibility}"-->
                    <ListView Margin="0,5" Name="lstResult" Width="369" Height="327" MinHeight="327" MinWidth="369">
                            <ListView.View>
                                <GridView>
                                    <GridViewColumn Header="ID" DisplayMemberBinding="{Binding Path=ENTITEMD_ID}"></GridViewColumn>
                                    <GridViewColumn Header="NOM TABLE DB" DisplayMemberBinding="{Binding Path=ENTITEMD_NOM_TABLE_DB}"></GridViewColumn>
                                    <GridViewColumn Header="Definition L01" DisplayMemberBinding="{Binding Path=ENTITEMD_DEFINITION_L01}"></GridViewColumn>
                                </GridView>
                            </ListView.View>
                        </ListView>
                    </jmb:View>
            </StackPanel>
        </Grid>
     
    </UserControl>
    Et je tombes sur ma merveilleuse erreur de compilation a la compilation de mon control :
    Cannot resolve the Style Property 'DisplayDataAtOpening'. Verify that the owning type is the Style's TargetType, or use Class.Property syntax to specify the Property.

    Donc 1 je me demandais si j'avancais dans la démarche de trouver une solution et
    de 2 je me demandais toujours si quelqu'un aurait la solution ou pourrait m'indiquer une autre piste.

    Merci Beaucoup
    Pascal Wick
    Programmeur-Analyste Sr.
    Groupe OnePoint
    Pascal Wick
    Programmeur-Analyste Sr.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 62
    Points : 43
    Points
    43
    Par défaut Résolu
    En fait il fallait :
    1. que mon style soit de targetType UserControl et non du targetType de mon control soit ici JMBSearchControl.
    2. Il falait que lorsque j'interroge les proprieter de la facon suivante : local:JMBSearchControl.DisplayDataAtOpening
    3. Il falait aussi que j'utilise la meme facon dans mon setter soit : <Setter Property="local:JMBSearchControl.VResultVisibility"
    4. En précisant un nom a mon control avec la Proprieter Name de la balise <UserControl Name = ctl> j'ai pu binder la proprieter Visibility d'un de mes conteneur grace a Visibility="{Binding Path=VResultVisibility, ElementName=ctl}">


    Ce qui donne comme xaml pour le style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <UserControl  x:Class="JMB.FRAMEWORK.WPF.UserControls.JMBSearchControl"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:jmb="clr-namespace:JMB.Framework.WPF;assembly=JMB.Framework.WPF"
        xmlns:jmbGrid="http://schemas.microsoft.com/wpf/2008/toolkit"
        xmlns:local="clr-namespace:JMB.FRAMEWORK.WPF.UserControls"
        Height="544" Width="422" Name="ctl" >
        <UserControl.Style>
            <Style TargetType="{x:Type UserControl}">
                <Style.Triggers>
                    <Trigger Property="local:JMBSearchControl.DisplayDataAtOpening" Value="True">
                        <Setter Property="local:JMBSearchControl.VResultVisibility" Value="Visible"/>
                    </Trigger>
                    <Trigger Property="local:JMBSearchControl.DisplayDataAtOpening" Value="False">
                        <Setter Property="local:JMBSearchControl.VResultVisibility" Value="Collapsed"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </UserControl.Style>
    Pascal Wick
    Groupe OnePoint
    Pascal Wick
    Programmeur-Analyste Sr.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bind d'une textbox d'une usercontrol sur une Dependency property
    Par Yogy dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 27/04/2010, 05h26
  2. Réponses: 4
    Dernier message: 16/10/2006, 12h17
  3. Réponses: 3
    Dernier message: 08/10/2006, 19h59
  4. "Dependency Files" pour MSSCRIPT.OCX
    Par mofetil dans le forum VB 6 et antérieur
    Réponses: 34
    Dernier message: 23/08/2006, 18h00
  5. Réponses: 5
    Dernier message: 10/07/2006, 08h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo