WPF XAML DataTrigger ContentTemplate
Я использую стиль TargetType "ContentPresenter" с DataTriggers для динамического назначения ContentTemplate.
<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>
Шаблоны данных выглядят так:
<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>
Таким образом, в зависимости от значения TAT_LIBELLE, выбирается правильный шаблон ContentTemplate.
У меня проблема с DataTemplate: "dataDate". Значение SelectedDate "ATT_VALUE" соответствует другой строке моего источника, которая имеет значение TAT_LIBELLE!= "Date". Я обнаружил это, потому что у меня было исключение в конвертере: StringToDateTimeConverter.
Как это возможно? Потому что обычно только строки моего источника, имеющие TAT_LIBELLE = "date", используют этот ContentTemplate!?
Я не использую правильный метод для динамического управления моим ContentTemplate?
Спасибо.
PS: извините за мой английский...