2013-05-02 4 views
0

J'ai créé un WPF qui sert à obtenir un numéro de série d'un client. Dans le cadre du processus, j'essaie de le valider afin que la longueur de chaque segment soit exactement de 5 caractères et que tous les caractères soient des lettres ou des chiffres. J'ai suivi le plan donné here. Le problème est qu'il ne semble pas faire quoi que ce soit, et j'ai suivi les instructions pour le bouton soumettre aussi et il soumettra avec des données incorrectes, alors qu'il semble qu'il ne devrait pas valider si les valeurs ne sont pas ' t bien. Est-ce que cela a quelque chose à voir avec la liaison Path? Si non, pourquoi mes champs ne seront-ils pas validés?La validation WPF ne fonctionnait pas

Le code pour la ValidationRule ressemble à ceci:

namespace Syncagent.Installer 
{ 
class LicenseValidationRule : ValidationRule 
{ 
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     if(!(value.ToString().Length == 5)) 
      return new ValidationResult(false,"Incorrect number of characters."); 

     Regex rExp = new Regex("^[A-Z0-9]*$"); 
     if (!rExp.IsMatch(value.ToString().ToUpper())) 
     { 
      return new ValidationResult(false,"A key may contain only numbers and letters."); 
     } 

     return new ValidationResult(true, null); 
    } 
} 
} 

Voici le XAML:

<Window x:Name="wFusionKey" x:Class="SyncAgent.Installer.KeyForm" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:SyncAgent.Installer" 
    Title="FusionKeyForm" Height="158" Width="338" ResizeMode="NoResize"> 
<Grid Margin="0,0,-6,1" HorizontalAlignment="Left" Width="334"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="0*"/> 
     <ColumnDefinition/> 
    </Grid.ColumnDefinitions> 
    <Button x:Name="btnOkay" Content="Submit" HorizontalAlignment="Left" Margin="166,96,0,0" VerticalAlignment="Top" Width="75" Grid.Column="1" Height="22" IsDefault="True" Click="btnOkay_Click"/> 
    <Label x:Name="lblFusionLicenseKey" Content="Please enter your 25-digit Fusion License Key here." HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Grid.Column="1" Height="26" Width="278"/> 
    <TextBox x:Name="txtFusion1" HorizontalAlignment="Left" Height="23" Margin="10,57,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="51" Grid.Column="1" MaxLength="5" MaxWidth="Infinity"> 
     <TextBox.Text> 
      <Binding Path="/" Mode="default" UpdateSourceTrigger="PropertyChanged"> 
       <Binding.ValidationRules> 
        <local:LicenseValidationRule/> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
    <Button x:Name="btnCancel" Grid.ColumnSpan="2" Content="Cancel" HorizontalAlignment="Left" Margin="246,96,0,0" VerticalAlignment="Top" Width="75" IsCancel="True"/> 
    <TextBox x:Name="txtFusion2" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="23" Margin="76,57,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="50" MaxLength="5"> 
     <TextBox.Text> 
      <Binding Path="Left" UpdateSourceTrigger="PropertyChanged"> 
       <Binding.ValidationRules> 
        <local:LicenseValidationRule/> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
    <TextBox x:Name="txtFusion3" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="23" Margin="141,57,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="50" MaxLength="5"> 
     <TextBox.Text> 
      <Binding Path="Left" UpdateSourceTrigger="PropertyChanged"> 
       <Binding.ValidationRules> 
        <local:LicenseValidationRule/> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
    <TextBox x:Name="txtFusion4" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="23" Margin="206,57,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="50" MaxLength="5" RenderTransformOrigin="1.491,0.522"> 
     <TextBox.Text> 
      <Binding Path="Left" UpdateSourceTrigger="PropertyChanged"> 
       <Binding.ValidationRules> 
        <local:LicenseValidationRule/> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
    <TextBox x:Name="txtFusion5" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="23" Margin="271,57,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="50" MaxLength="5"> 
     <TextBox.Text> 
      <Binding Path="Left" UpdateSourceTrigger="PropertyChanged"> 
       <Binding.ValidationRules> 
        <local:LicenseValidationRule/> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
+0

Voyez-vous appeler LicenseValidationRule et lancer une fausse validation? Le chemin de liaison de/est impair. – Paparazzi

+0

Non, je ne pense pas que cela fasse quoi que ce soit. J'ai fait un chemin de liaison de '/' pour tester si cela changerait les choses. J'ai l'impression que le chemin de liaison est mauvais, mais je ne sais pas ce que je suis censé faire. – ijb109

+0

Vous devez définir le datacontext et le chemin. Réglez simplement le datacontext à ceci et ayez la propriété publique pour txtFusion1. Le chemin est le nom de cette propriété publique. – Paparazzi

Répondre

2

Je ne sais pas ce que votre TextBox est lié comme je ne peux pas voir votre code derrière, Cependant, votre validateur semble fonctionner correctement lorsque votre texte TextBox est lié à une chaîne.

Voici un exemple simple de votre validateur attaché à un TextBox qui est lié à une chaîne.

code:

/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    private string _myTextToValidate; 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public string MyTextToValidate 
    { 
     get { return _myTextToValidate; } 
     set { _myTextToValidate = value; NotifyPropertyChanged("MyTextToValidate"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void NotifyPropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 
} 

Xaml:

<Window x:Class="WpfApplication11.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication11" 
     Title="MainWindow" Height="89" Width="166" Name="UI"> 

    <Grid DataContext="{Binding ElementName=UI}"> 
     <TextBox Height="23" Margin="12" > 
      <TextBox.Text> 
       <Binding Path="MyTextToValidate" UpdateSourceTrigger="PropertyChanged"> 
        <Binding.ValidationRules> 
         <local:LicenseValidationRule/> 
        </Binding.ValidationRules> 
       </Binding> 
      </TextBox.Text> 
     </TextBox> 
    </Grid> 
</Window> 

Peut-être que cela va aider à suivre votre question.

+0

C'est exactement ça. J'essayais de comprendre comment la liaison fonctionnait, cela m'a donné un exemple concret. Merci beaucoup! – ijb109