Bonjour,

J'utilise un style de TargetType "ContentPresenter" avec des DataTriggers pour affecter dynamiquement un ContentTemplate.

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
 
    <Style x:Key="styleContentValeur" TargetType="{x:Type ContentPresenter}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding TAT_LIBELLE, Mode=OneWay}" Value="chaine">
                <Setter Property="ContentTemplate" Value="{StaticResource dataChaine}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding TAT_LIBELLE, Mode=OneWay}" Value="chainemultiligne">
                <Setter Property="ContentTemplate" Value="{StaticResource dataChaineMultiligne}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding TAT_LIBELLE, Mode=OneWay}" Value="entier">
                <Setter Property="ContentTemplate" Value="{StaticResource dataEntier}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding TAT_LIBELLE, Mode=OneWay}" Value="reel">
                <Setter Property="ContentTemplate" Value="{StaticResource dataReel}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding TAT_LIBELLE, Mode=OneWay}" Value="booleen">
                <Setter Property="ContentTemplate" Value="{StaticResource dataBooleen}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding TAT_LIBELLE, Mode=OneWay}" Value="liste">
                <Setter Property="ContentTemplate" Value="{StaticResource dataListe}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding TAT_LIBELLE, Mode=OneWay}" Value="listedynamique">
                <Setter Property="ContentTemplate" Value="{StaticResource dataListe}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding TAT_LIBELLE, Mode=OneWay}" Value="date">
                <Setter Property="ContentTemplate" Value="{StaticResource dataDate}" />
            </DataTrigger>
            <DataTrigger Binding="{Binding TAT_LIBELLE, Mode=OneWay}" Value="grammaire">
                <Setter Property="ContentTemplate" Value="{StaticResource dataChaine}" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
Les DataTemplates sont comme ceci :

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
 
    <DataTemplate x:Key="dataChaine">
        <local:TextBoxPerso Style="{StaticResource styleTextBox}"
                            HorizontalContentAlignment="Left" VerticalContentAlignment="Center"
                            TextWrapping="NoWrap" AcceptsReturn="False" AcceptsTab="False"
                            oAttribut="{Binding}"
                            Text="{Binding ATT_VALEUR, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                            IsEnabled="{Binding IsEnabled, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
    </DataTemplate>
 
    <DataTemplate x:Key="dataChaineMultiligne">
        <local:TextBoxPerso  Margin="3" 
                             Style="{StaticResource styleTextBox}"
                             HorizontalContentAlignment="Left" VerticalContentAlignment="Top"
                             TextWrapping="Wrap" AcceptsReturn="True" AcceptsTab="False"
                             HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Hidden"
                             oAttribut="{Binding}"
                             Text="{Binding ATT_VALEUR, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                             IsEnabled="{Binding IsEnabled, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
    </DataTemplate>
 
    <DataTemplate x:Key="dataEntier">
        <local:TextBoxPerso  Style="{StaticResource styleTextBox}"
                             HorizontalContentAlignment="Left" VerticalContentAlignment="Center"
                             TextWrapping="NoWrap" AcceptsReturn="False" AcceptsTab="False"
                             oAttribut="{Binding}"
                             Text="{Binding ATT_VALEUR, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                             IsEnabled="{Binding IsEnabled, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
    </DataTemplate>
 
    <DataTemplate x:Key="dataReel">
        <local:TextBoxPerso  Style="{StaticResource styleTextBox}"
                             HorizontalContentAlignment="Right" VerticalContentAlignment="Center"
                             TextWrapping="NoWrap" AcceptsReturn="False" AcceptsTab="False"
                             oAttribut="{Binding}"
                             Text="{Binding ATT_VALEUR, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                             IsEnabled="{Binding IsEnabled, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
    </DataTemplate>
 
    <DataTemplate x:Key="dataBooleen">
        <local:CheckBoxPerso FocusVisualStyle="{x:Null}" IsChecked="{Binding ATT_VALEUR, Converter={StaticResource StringToBoolConverter}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                             IsEnabled="{Binding IsEnabled, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
    </DataTemplate>
 
    <DataTemplate x:Key="dataDate">
        <DatePicker IsTodayHighlighted="False" SelectedDate="{Binding ATT_VALEUR, Converter={StaticResource StringToDateTimeConverter}, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
                    IsEnabled="{Binding IsEnabled, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
    </DataTemplate>
 
    <DataTemplate x:Key="dataListe">
        <local:ComboBoxPerso IsEditable="True"
                             ItemsSource="{Binding tValeur}" DisplayMemberPath="ALV_VALEUR" SelectedValuePath="ALV_ID"
                             SelectedValue="{Binding ATT_VALEUR, Converter={StaticResource StringToIntConverter}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                             IsEnabled="{Binding IsEnabled, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
    </DataTemplate>
Donc selon la valeur de TAT_LIBELLE, cela sélectionne le bon ContentTemplate.

J'ai un soucis avec le DataTemplate : dataDate. La valeur de SelectedDate "ATT_VALEUR" correspond à une autre ligne de ma source qui à une valeur TAT_LIBELLE != "date".
J'ai découvert cela car j'ai eu une exception dans le Converter : StringToDateTimeConverter.

Comme est-ce possible ? Car normalement seulement les lignes de ma source ayant TAT_LIBELLE = "date" utilise ce ContentTemplate !?

Je n'utilise pas la bonne méthode pour gérer dynamiquement mes ContentTemplate ?

Merci.