Bonjour,

Je conçois actuellement une application C# / WPF. Je possède une fenêtre avec plusieurs Textboxs. Ces textBoxs sont bindés via WPF à mes propriétés d'une classe.

Lors qu'un utilisateur saisie une donnée dans ces textboxs, certaines données saisies ont besoins d'être validées, pour cela, j'utilise la validation offerte par WPF (ExceptionValidationRule), qui est d'ailleurs simple à utiliser.

Si la validation échoue, j'arrive donc à en informer l'utilisateur.

Mon problème est que je souhaiterai que l'utilisateur ne puisse pas sortir de la zone de saisie si cette dernière à une validation qui échoue, et ce, afin que l'utilisateur efface sa valeur, ou, la remplace par une valeur correcte.

Je souhaiterai savoir si c'est possible, et comment ?

Voici mon code C# présentant ma propriété bindée :

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
 
public string strEvtType
{
	get { return m_strEvtType; }
	set {
			m_strEvtType = value;
			if (m_objEvtCode.ReadEvtTypebyType(m_strEvtType) != 0)
			{
				throw new ApplicationException("Error ! : " + m_strEvtType.Trim() + " don't exist");
			}
			FirePropertyChangedEvent("strEvtType");
			FirePropertyChangedEvent("m_objEvtCode.strDes");
 
		}
}
Voilà maintenant mon code XAML

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
<TextBox Name="TextBox_TypeEvenement" Grid.Column="1" VerticalAlignment="Center" Height="20" LostFocus="TextBox_TypeEvenement_LostFocus">
  <TextBox.Text>
    <Binding Path="strEvtType">
        <Binding.ValidationRules>
            <ExceptionValidationRule />
        </Binding.ValidationRules>
    </Binding>
  </TextBox.Text>
</TextBox>
Et voilà maintenant mon Template XAML avec la validation

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
 
<Style TargetType="{x:Type TextBox}">
	<Setter Property="Validation.ErrorTemplate">
		<Setter.Value>
			<ControlTemplate>
				<DockPanel  LastChildFill="False">
					<TextBlock DockPanel.Dock="Right"
					Foreground="red"
					FontSize="9pt"
					Text="{Binding ElementName=MyAdorner,Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
					</TextBlock>
					<Border BorderBrush="Red" BorderThickness="1">
						<AdornedElementPlaceholder Name="MyAdorner" />
					</Border>
				</DockPanel>
			</ControlTemplate>
		</Setter.Value>
	</Setter>
</Style>
Je vous remercie d'avance tous pour votre lecture

Bien cordialement,


Nixeus