Bonjour à tous,

J'ai développé une petite application en WPF.
Cette application permet de créer des évènements.
J'ai donc une fenetre de saisie qui contient un DataGrid avec tous les évènements crées, et, en dessous de ce tableau des textboxs afin d'afficher les détails de l'évènement sur lequel est postionné l'utilisateur.

J'ai implémenté avec le binding la validation de la saisie. Ainsi, lorsqu'une donnée saisie par l'utilisateur est invalide, un libellé s'affiche à côté de mon textBoxs afin d'avertir l'utilisateur que la saisie est incorrect.

Mon problème est très simple :

Je possède plusieurs textboxs pour lesquelles la validation va tester l'existance de la donnée dans une table.

Exemple : Je possède une textbox client. Si je saisie un code client, le binding va aller vérifier dans la table "Client" si le client existe.
Si la donnée saisie n'existe pas, la validation n'est pas ok, et l'utilisateur est avertis de cette erreur.

En saisie, le mécanisme fonctionne très bien

Seulement voilà, je vais dans ma base de donnée, et supprime mon client dans la table Client. Lors de la prochaine entrée dans mon programme, le chargement des évènements va invoquer le binding, et là, la validation va aller vérifier que le code client existe dans ta table Client.

Le comportement "normal" voudrait que mon programme affiche un libellé a côté du textbox "client" disant que le client n'existe pas, or, au lieu de cela, la validation arrête le chargement des évènements, mon datagrid devient donc vide.

Je vois donc d'où vient le problème, mais je ne comprends pas ce comportement.

Un peu de code


Voici le code XAML de la définition de mon TextBox
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
<TextBox Name="TextBox_CodeClient" TabIndex="1" Grid.Column="1" VerticalAlignment="Center" Height="20">
	<TextBox.Text>
		<Binding Path="strCodeClient" >
			<Binding.ValidationRules>
				<ExceptionValidationRule />
			</Binding.ValidationRules>
		</Binding>
	</TextBox.Text>
</TextBox>
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="True">
                    <TextBlock Margin="50,0,0,0" DockPanel.Dock="Right"
                    Foreground="Red"
                    FontSize="10pt"
                    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>
Voici maintenant le binding, la variable strCodeClient fait partie de ma classe Evenement. Cette donc cette variable qui est liée au TexteBox code client:
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
 
public string strCodeClient
{
	get { return m_strCodeClient; }
	set {
			m_strCodeClient = value;
			if (m_strCodeClient.Trim() != "")
			{
				if (m_objEvtCode.ReadClientbyCode(m_strCodeClient) != 0)
				{
					throw new ApplicationException(m_strCodeClient.Trim() + " est inexistant !");
				}
				FirePropertyChangedEvent("strCodeClient");
			}
			else
			{
				objEvtCode.strNom = "";
				objEvtCode.strCode = "";
			}
 
			FirePropertyChangedEvent("objEvtCode.strNom");
 
		}
}
Dans mon Windows_Load, mon programme va simplement aller lire TOUS les évènements en les stockants dans une ObservableListe d'objets évènements.

Lors de ce chargement, le code client est vérifié, et si il n'existe pas, au lieu d'affiche un message d'erreur, lorsque le programme passe sur la ligne
Code : Sélectionner tout - Visualiser dans une fenêtre à part
throw new ApplicationException(m_strCodeClient.Trim() + " est inexistant !");
la procédure chargeant tous les évènements se quitte, et le datagrid est vide

J'éspère avoir été assez clair et détaillé dans mon message, j'éspère que quelqu'un pourra m'aider

Merci à tous

Bien cordialement,

Nixeus