Så här implementerar du bindningsverifiering
Det här exemplet visar hur du använder en ErrorTemplate och en formatutlösare för att ge visuell feedback för att informera användaren när ett ogiltigt värde anges, baserat på en anpassad verifieringsregel.
Exempel
Textinnehållet i TextBox i följande exempel är bundet till egenskapen Age
(av typen int) för ett bindningskällaobjekt med namnet ods
. Bindningen är konfigurerad att använda en verifieringsregel med namnet AgeRangeRule
så att om användaren anger icke-numeriska tecken eller ett värde som är mindre än 21 eller större än 130 visas ett rött utropstecken bredvid textrutan och ett verktygstips med felmeddelandet visas när användaren flyttar musen över textrutan.
<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>
I följande exempel visas implementeringen av AgeRangeRule
, som ärver från ValidationRule och åsidosätter metoden Validate. Metoden Int32.Parse
anropas på värdet för att se till att den inte innehåller några ogiltiga tecken. Metoden Validate returnerar en ValidationResult som anger om värdet är giltigt baserat på om ett undantag fångas under parsningen och om åldersvärdet ligger utanför de nedre och övre gränserna.
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
I följande exempel visas den anpassade ControlTemplatevalidationTemplate
som skapar ett rött utropstecken för att meddela användaren om ett valideringsfel. Kontrollmallar används för att omdefiniera utseendet på en kontroll.
<ControlTemplate x:Key="validationTemplate">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20">!</TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
Som du ser i följande exempel skapas ToolTip som visar felmeddelandet med formatet textBoxInError
. Om värdet för HasError är true
anger utlösaren verktygsspetsen för den aktuella TextBox till det första valideringsfelet.
RelativeSource är inställt på Self, med hänvisning till det aktuella elementet.
<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>
Dataobjekt
Följande kodfragment är det dataobjekt som användes i föregående kodexempel. En instans skapas i XAML som en statisk resurs med nyckeln för ods
:
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
Fullständigt exempel
Det fullständiga exemplet finns i exempel på bindningsverifiering.
Observera att om du inte anger en anpassad ErrorTemplate visas standardfelmallen för att ge visuell feedback till användaren när det finns ett valideringsfel. Mer information finns i "Dataverifiering" i Översikt över databindning. WPF tillhandahåller också en inbyggd valideringsregel som fångar upp undantag som utlöses under uppdateringen av bindningskällans egenskap. Mer information finns i ExceptionValidationRule.
Se även
- Översikt över databindning
- guider och anvisningar
.NET Desktop feedback