Bonjour,

voilà la situation :
un formulaire avec un champ sous forme d'une TextBox dont les valeurs doivent être numériques.
La validation des valeurs est assurée par une ValidationRule.

Je souhaiterais que :
- quand la valeur est valide la TextBox soit entourée d'une bordure verte et qu'à côté soit positionnée une image indiquant que la valeur est valide;
- quand la valeur est invalide la bordure soit rouge et une autre image s'affiche.

Pour le deuxième comportement l'affectation de l'ErrorTemplate fait complètement l'affaire :
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
<DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.HasError)}" Value="True">
	<Setter	Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors)[0].ErrorContent}" />
	<Setter Property="Validation.ErrorTemplate">
		<Setter.Value>
			<ControlTemplate>
				<DockPanel>
					<Border BorderBrush="Red" BorderThickness="1" DockPanel.Dock="Left">
						<AdornedElementPlaceholder />
					</Border>
					<Image Height="16" Width="16" Source="error.png" DockPanel.Dock="Right"/>
				</DockPanel>
			</ControlTemplate>
		</Setter.Value>
	</Setter>
</DataTrigger>
En effet l'utilisation de AdornedElementPlaceholder permet d'intégrer la TextBox dans le template.

Mais pour le comportement en cas de validité ce n'est pas aussi évident :
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
<DataTrigger Binding="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.HasError)}" Value="False">
	<Setter	Property="ToolTip" Value="Enter a number" />
	<Setter Property="Template">
		<Setter.Value>
			<ControlTemplate>
				<DockPanel>
					<Border BorderBrush="Green" BorderThickness="1" DockPanel.Dock="Left">
						<AdornedElementPlaceholder />
					</Border>
					<Image Height="16" Width="16" Source="noerror.png" DockPanel.Dock="Right"/>
				</DockPanel>
			</ControlTemplate>
		</Setter.Value>
	</Setter>
</DataTrigger>
En effet il semble que l'utilisation de AdornedElementPlaceholder soit réservée à l'ErrorTemplate.
Ici c'est logique : cela n'a pas de sens de définir un contrôle, à l'aide de son Template, à partir de lui même : ça tourne en rond.

Une solution serait de ne pas utiliser d'ErrorTemplate en :
- définissant la forme générale du champ : une TextBox entourée d'une Border nommée avec Name,
- une Image nommé également,
- définir les triggers ailleurs pour selon l'état de validation :
-- affecter une couleur différente à la Border ,
-- changer la propriété Source de l'Image.
Mais c'est moins "WPF".


Deux questions donc :
1) Y a t-il un moyen d'intégrer la TextBox au sein d'un nouveau template si la validation est bonne ?
2) Quelles autres solutions sont envisageables ?



Merci d'avance.