none
Forcer à garder le focus sur le contrôle ayant causé une ExceptionValidationRule lors de la validation du binding RRS feed

  • Question

  • 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 :

    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

    <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

    <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



    • Modifié Nixeus mardi 19 mars 2013 10:49
    mardi 19 mars 2013 10:31

Toutes les réponses