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:
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:
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.
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:
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:
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. :bug: :bug: :bug:
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.