2013-05-02 3 views
0

Я создал WPF, который служит для получения серийного номера от клиента. В рамках процесса я пытаюсь проверить его так, чтобы длина каждого сегмента составляла ровно 5 символов, а все символы - буквы или цифры. Я следил за контуром here.WPF Validation не работает

Проблема в том, что она ничего не делает, и я также выполнил инструкции для кнопки отправки, и она будет отправляться с неправильными данными, тогда как кажется, что она не должна проверять, соответствуют ли значения aren ' t правильно. Имеет ли это какое-либо отношение к привязке Path? Если нет, почему мои поля не проверяются?

Код для ValidationRule выглядит следующим образом:

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); 
    } 
} 
} 

Вот 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

Вы видите, что он вызывает LicenseValidationRule и выдает ложную проверку? Путь привязки/нечетен. – Paparazzi

+0

Нет, я не думаю, что это вообще что-то делает. Я выполнил путь привязки '/', чтобы проверить, не изменит ли это. Я чувствую, что путь привязки неверен, но я не знаю, что я должен устанавливать. – ijb109

+0

Вам необходимо установить datacontext и путь. Просто установите для этого datacontext и у вас есть общедоступное свойство txtFusion1. Путь - это имя этого публичного имущества. – Paparazzi

ответ

2

Я не уверен, что ваш TextBox обязан, как я не могу увидеть код позади, однако, как правило, ваш валидатор работает нормально, когда текст TextBox привязан к строке.

Вот простой пример вашего Validator, прикрепленного к TextBox, который привязан к строке.

Код:

/// <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> 

Может быть, это поможет отследить проблему.

+0

Именно так. Я пытался выяснить, как работает привязка, это дало мне конкретный пример. Спасибо огромное! – ijb109