2016-05-15 11 views
1

Ich bin neu in WPF, und ich versuche Bindung Validierung von https://msdn.microsoft.com/en-us/library/system.windows.controls.validation.errortemplate%28v=vs.100%29.aspx?f=255&MSPPError=-2147217396 zu implementieren,WPF Bindung Validierung incorect Präfix

ich die XAML und C# -Code von der Website zu kopieren und es gibt Probleme mit dem Präfix in XAML

<TextBox Name="textBox1" Width="50" FontSize="15" 
     Validation.ErrorTemplate="{StaticResource validationTemplate}" 
     Style="{StaticResource textBoxInError}" 
     Grid.Row="1" Grid.Column="1" Margin="2"> 
    <TextBox.Text> 
    <Binding Path="Age" Source="{StaticResource ods}" 
      UpdateSourceTrigger="PropertyChanged" > 
     <Binding.ValidationRules> 
     <c:AgeRangeRule Min="21" Max="130"/> 
     </Binding.ValidationRules> 
    </Binding> 
    </TextBox.Text> 
</TextBox> 

Es steht geschrieben, dass es kein c Präfix gibt. Ich habe versucht, alle möglichen Präfixe zu verwenden, aber es wirft, dass AgeValidationRule in diesem Präfix nicht unterstützt wird.

Wie kann ich das funktionieren lassen?

Antwort

0

Es steht geschrieben, dass es kein c-Präfix ist.

<Binding.ValidationRules> 
    <c:AgeRangeRule Min="21" Max="130"/> 
</Binding.ValidationRules> 

XAML verwendet eine prefix eine namespace in Ihrer Lösung abzubilden. Bedeutung irgendwo in der msdn Beispielcode innerhalb der XAML sollte das c Präfix deklariert haben, das dem Namespace entspricht, wo AgeRangeRule Klasse sollte lokalisiert werden.

Die Einfachheit halber könnte man einfach die AgeRangeRule Klasse zu Ihrem Projekt hinzufügen und den local Präfix verwenden, die Ihr Projektes Namensraum zuordnet (zB xmlns:local="clr-namespace:WpfApplication1" bedeutet, dass ich mein Projekt WpfApplication1 genannt habe so etwas Klasse Ich habe in diesen namespace kann durch zugegriffen werden das Präfix

AgeValidationRule wird in diesem Präfix nicht unterstützt.

Dies zeigt, dass Sie die Probe XAML Code wie folgt geändert haben ...

<Binding.ValidationRules> 
    <c:AgeValidationRule Min="21" Max="130"/> 
</Binding.ValidationRules> 

so mit, dass Sie auch die Probe AgeRangeRule Klasse von Msdn zu AgeValidationRule bereitgestellt ändern sollte ... und Ort, in die namespace, in der die prefixc Maps zu. (ODER einfach in den Namespace deines Projekts einfügen und das Präfix local verwenden, wie ich oben erwähnt habe)

0

Um es Arbeit sicherstellen, dass Sie die folgenden Schritte folgen:

  1. Zum Visual Studio
  2. Wählen Sie Neues Projekt erstellen -> WPF-Projekt
  3. Kopieren Sie den obigen Code in Ihre <Grid> </Grid> Tag
  4. Erstellen Sie in Ihrem Projekt eine Klasse mit dem Namen AgeRangeRule.cs, und fügen Sie der Klassendatei den folgenden Code hinzu.

    Öffentliche Klasse AgeRangeRule: ValidationRule { private int _min; private int_max;

    public AgeRangeRule() 
    { 
    } 
    
    public int Min 
    { 
        get { return _min; } 
        set { _min = value; } 
    } 
    
    public int Max 
    { 
        get { return _max; } 
        set { _max = value; } 
    } 
    
    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
        int age = 0; 
    
        try 
        { 
         if (((string)value).Length > 0) 
          age = Int32.Parse((String)value); 
        } 
        catch (Exception e) 
        { 
         return new ValidationResult(false, "Illegal characters or " + e.Message); 
        } 
    
        if ((age < Min) || (age > Max)) 
        { 
         return new ValidationResult(false, 
          "Please enter an age in the range: " + Min + " - " + Max + "."); 
        } 
        else 
        { 
         return new ValidationResult(true, null); 
        } 
    } 
    

    }

  5. nun den Namespace zu Ihrem Projekt hinzufügen, wie unten

    xmlns: c = "clr-namespace: WpfApplication2"

wobei c die bezeichnet wird Namespace hier und WpfApplication2 soll durch Ihren Lösungsnamen ersetzt werden.

EDIT: Aktualisierter XAML-Code unten.

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication2" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Grid.Resources> 
      <ControlTemplate x:Key="validationTemplate"> 
       <DockPanel> 
        <TextBlock Foreground="Red" FontSize="20">!</TextBlock> 
        <AdornedElementPlaceholder/> 
       </DockPanel> 
      </ControlTemplate> 
      <Style x:Key="textBoxInError" TargetType="{x:Type TextBox}"> 
       <Style.Triggers> 
        <Trigger Property="Validation.HasError" Value="true"> 
         <Setter Property="ToolTip" 
     Value="{Binding RelativeSource={x:Static RelativeSource.Self}, 
         Path=(Validation.Errors)[0].ErrorContent}"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 

     </Grid.Resources> 

     <Grid.RowDefinitions> 
      <RowDefinition></RowDefinition> 
      <RowDefinition></RowDefinition> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition></ColumnDefinition> 
      <ColumnDefinition></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <TextBox Name="textBox1" Width="50" FontSize="15" 
     Validation.ErrorTemplate="{StaticResource validationTemplate}" 
     Style="{StaticResource textBoxInError}" 
     Grid.Row="1" Grid.Column="1" Margin="2"> 
      <TextBox.Text> 
       <Binding Path="Age" Source="{StaticResource ods}" 
      UpdateSourceTrigger="PropertyChanged" > 
        <Binding.ValidationRules> 
         <local:AgeRangeRule Min="21" Max="130"/> 
        </Binding.ValidationRules> 
       </Binding> 
      </TextBox.Text> 
     </TextBox> 
    </Grid> 
</Window> 
+0

okey, ich habe es aber jetzt, ich habe ein anderes Problem 'Validation.ErrorTemplate =" {StaticResource validationTemplate} '" wirft das Es kann nicht aufgelöst werden, dasselbe gilt für 'Style =" {StaticResource textBoxInError} "und' Source = "{StaticResource ods}" ' – Vinci

+0

Sie müssen den Code in msdn addieren. Ich habe die Frage bearbeitet. Bitte prüfe. Für ** ods ** müssen Sie auch eine statische Ressource hinzufügen. Das hängt von Ihrer Anforderung ab. – ViVi

+0

Versuchen Sie auch, WPF Grundlagen zu lernen, indem Sie einige Tutorials verweisen. Ohne das wird es sehr schwierig für dich sein. – ViVi