Megosztás a következőn keresztül:


Útmutató: Kötésérvényesítés implementálása

Ez a példa bemutatja, hogyan használható egy ErrorTemplate és egy stílusindító, amely vizuális visszajelzést ad a felhasználónak, amikor érvénytelen értéket ad meg egy egyéni érvényesítési szabály alapján.

példa

Az alábbi példában szereplő TextBox szöveges tartalma egy Agenevű kötésforrás objektum ods tulajdonságához (int típusú) van kötve. A kötés úgy van beállítva, hogy egy AgeRangeRule nevű érvényesítési szabályt használjon, így ha a felhasználó nem numerikus karaktereket vagy 21-nél kisebb vagy 130-nál kisebb értéket ad meg, a szövegmező mellett piros felkiáltójel jelenik meg, és megjelenik egy hibaüzenetet tartalmazó eszköztipp, amikor a felhasználó az egeret a szövegdoboz fölé helyezi.

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

Az alábbi példa a AgeRangeRuleimplementálását mutatja be, amely a ValidationRule-től örököl, és felülbírálja a Validate metódust. A Int32.Parse metódust a rendszer meghívja az értékre annak érdekében, hogy ne tartalmazzon érvénytelen karaktereket. A Validate metódus egy ValidationResult ad vissza, amely azt jelzi, hogy az érték érvényes-e attól függően, hogy kivétel történt-e az elemzés során, és hogy az életkor értéke kívül esik-e az alsó és a felső határon.

public class AgeRangeRule : ValidationRule
{
    public int Min { get; set; }
    public int Max { get; set; }

    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        int age = 0;

        try
        {
            if (((string)value).Length > 0)
                age = int.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}.");
        }
        return ValidationResult.ValidResult;
    }
}
Public Class AgeRangeRule
    Inherits ValidationRule

    ' Properties
    Public Property Max As Integer
    Public Property Min As Integer
        
    ' Methods
    Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult
        Dim num1 As Integer = 0
        Try 
            If (CStr(value).Length > 0) Then
                num1 = Integer.Parse(CStr(value))
            End If
        Catch exception1 As Exception
            Return New ValidationResult(False, $"Illegal characters or {exception1.Message}")
        End Try
        If ((num1 < Min) OrElse (num1 > Max)) Then
            Return New ValidationResult(False, $"Please enter an age in the range: {Min}-{Max}.")
        End If
        Return ValidationResult.ValidResult
    End Function

End Class

Az alábbi példa azt az egyéni ControlTemplatevalidationTemplate mutatja, amely piros felkiáltójelet hoz létre, amely értesíti a felhasználót egy érvényesítési hibáról. A vezérlők megjelenését vezérlősablonokkal definiáljuk újra.

<ControlTemplate x:Key="validationTemplate">
  <DockPanel>
    <TextBlock Foreground="Red" FontSize="20">!</TextBlock>
    <AdornedElementPlaceholder/>
  </DockPanel>
</ControlTemplate>

Az alábbi példában látható módon a hibaüzenetet megjelenítő ToolTip az textBoxInErrornevű stílussal jön létre. Ha a HasError értéke true, az eseményindító az aktuális TextBox eszköztippjét az első érvényesítési hibára állítja. A RelativeSource az aktuális elemre hivatkozó Selfértékre van állítva.

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

Adatobjektum

Az alábbi kódrészlet az előző kódpéldákban használt adatobjektum. A példány a XAML-ben statikus erőforrásként jön létre a odskulcsával.

public class MyDataSource
{
    public MyDataSource()
    {
        Age = 0;
        Age2 = 0;
    }

    public int Age { get; set; }
    public int Age2 { get; set; }
    public int Age3 { get; set; }
}
Public Class MyDataSource
    Public Sub New()
        Me.Age = 0
        Me.Age2 = 0
    End Sub

    Public Property Age As Integer
    Public Property Age2 As Integer
    Public Property Age3 As Integer
End Class

Teljes példa

A teljes példáért lásd kötésérvényesítési minta.

Amennyiben nem ad meg egyéni ErrorTemplate-t, az alapértelmezett hibasablon jelenik meg, amely vizuális visszajelzést nyújt a felhasználónak érvényesítési hiba esetén. Lásd az "Adatérvényesítés" részt a Adatkötés áttekintése-ben további információkért. Emellett a WPF egy beépített érvényesítési szabályt is biztosít, amely a kötés forrástulajdonságának frissítése során fellépő kivételeket rögzíti. További információért lásd ExceptionValidationRule.

Lásd még