ValidationStep Wyliczenie
Definicja
Określa, kiedy ValidationRule działa.Specifies when a ValidationRule runs.
public enum class ValidationStep
public enum ValidationStep
type ValidationStep =
Public Enum ValidationStep
- Dziedziczenie
Pola
CommittedValue | 3 | Uruchamia ValidationRule po zatwierdzeniu wartości źródłowej.Runs the ValidationRule after the value has been committed to the source. |
ConvertedProposedValue | 1 | Uruchamia ValidationRule po konwersji wartości.Runs the ValidationRule after the value is converted. |
RawProposedValue | 0 | Działa ValidationRule przed konwersją.Runs the ValidationRule before any conversion occurs. |
UpdatedValue | 2 | Uruchamiany ValidationRule po zaktualizowaniu źródła.Runs the ValidationRule after the source is updated. |
Przykłady
W poniższym przykładzie zastosowano regułę walidacji o nazwie ValidateDateAndPrice
.The following example uses a validation rule named ValidateDateAndPrice
. ValidationRule.ValidationStepDla tej reguły jest ustawiona na ConvertedProposedValue
tak, aby podczas uruchamiania, ValidationRule.Validate Metoda ma dostęp do wartości, które są typu właściwości źródła.The ValidationRule.ValidationStep for this rule is set to ConvertedProposedValue
so that when it runs, the ValidationRule.Validate method has access to values that are of the source property's type.
Gdy PriceIsAPositiveNumber
reguły i FutureDateRule
są uruchamiane, wartości w każdej ValidationRule.Validate metodzie są ciągami, ponieważ wartością domyślną ValidationRule.ValidationStep jest RawProposedValue
.When the PriceIsAPositiveNumber
and FutureDateRule
rules run, the values in each ValidationRule.Validate method are strings because the default value of ValidationRule.ValidationStep is RawProposedValue
. W związku z tym reguły są uruchamiane przed konwersją wartości na odpowiednie typy.Therefore, the rules run before the values are converted to their respective types.
<StackPanel Name="stackPanel1" Margin="10" Width="250"
Loaded="stackPanel1_Loaded"
Validation.Error="ItemError">
<StackPanel.Resources>
<Style TargetType="HeaderedContentControl">
<Setter Property="Margin" Value="2"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="HeaderedContentControl">
<DockPanel LastChildFill="False">
<ContentPresenter ContentSource="Header" DockPanel.Dock="Left" Focusable="False" VerticalAlignment="Center"/>
<ContentPresenter ContentSource="Content" Margin="5,0,0,0" DockPanel.Dock="Right" VerticalAlignment="Center"/>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="Button">
<Setter Property="Width" Value="100"/>
<Setter Property="Margin" Value="10,15,15,15"/>
</Style>
</StackPanel.Resources>
<StackPanel.BindingGroup>
<BindingGroup NotifyOnValidationError="True">
<BindingGroup.ValidationRules>
<src:ValidateDateAndPrice ValidationStep="ConvertedProposedValue" />
</BindingGroup.ValidationRules>
</BindingGroup>
</StackPanel.BindingGroup>
<TextBlock FontSize="14" Text="Enter an item for sale"/>
<HeaderedContentControl Header="Description">
<TextBox Width="150" Text="{Binding Path=Description, Mode=TwoWay}"/>
</HeaderedContentControl>
<HeaderedContentControl Header="Price">
<TextBox Name="priceField" Width="150">
<TextBox.Text>
<Binding Path="Price" Mode="TwoWay" >
<Binding.ValidationRules>
<src:PriceIsAPositiveNumber/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</HeaderedContentControl>
<HeaderedContentControl Header="Date Offer Ends">
<TextBox Name="dateField" Width="150" >
<TextBox.Text>
<Binding Path="OfferExpires" StringFormat="d" >
<Binding.ValidationRules>
<src:FutureDateRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
</HeaderedContentControl>
<StackPanel Orientation="Horizontal">
<Button IsDefault="True" Click="Submit_Click">_Submit</Button>
<Button IsCancel="True" Click="Cancel_Click">_Cancel</Button>
</StackPanel>
<HeaderedContentControl Header="Description">
<TextBlock Width="150" Text="{Binding Path=Description}"/>
</HeaderedContentControl>
<HeaderedContentControl Header="Price">
<TextBlock Width="150" Text="{Binding Path=Price, StringFormat=c}"/>
</HeaderedContentControl>
<HeaderedContentControl Header="Date Offer Ends">
<TextBlock Width="150" Text="{Binding Path=OfferExpires, StringFormat=d}"/>
</HeaderedContentControl>
</StackPanel>
Poniższy przykład pokazuje ValidateDateAndPrice
regułę walidacji.The following example shows the ValidateDateAndPrice
validation rule. W ValidationRule.Validate metodzie Price
Właściwość jest typu Double , a OfferExpires
Właściwość jest typu DateTime .In the ValidationRule.Validate method, the Price
property is of type Double, and the OfferExpires
property is of type DateTime. Ciągi zostały przekonwertowane na odpowiednie typy według czasu ValidationRule
uruchomienia.The strings have been converted to their respective types by the time the ValidationRule
runs.
public class ValidateDateAndPrice : ValidationRule
{
// Ensure that an item over $100 is available for at least 7 days.
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
BindingGroup bg = value as BindingGroup;
// Get the source object.
PurchaseItem item = bg.Items[0] as PurchaseItem;
object doubleValue;
object dateTimeValue;
// Get the proposed values for Price and OfferExpires.
bool priceResult = bg.TryGetValue(item, "Price", out doubleValue);
bool dateResult = bg.TryGetValue(item, "OfferExpires", out dateTimeValue);
if (!priceResult || !dateResult)
{
return new ValidationResult(false, "Properties not found");
}
double price = (double)doubleValue;
DateTime offerExpires = (DateTime)dateTimeValue;
// Check that an item over $100 is available for at least 7 days.
if (price > 100)
{
if (offerExpires < DateTime.Today + new TimeSpan(7, 0, 0, 0))
{
return new ValidationResult(false, "Items over $100 must be available for at least 7 days.");
}
}
return ValidationResult.ValidResult;
}
}
Public Class ValidateDateAndPrice
Inherits ValidationRule
' Ensure that an item over $100 is available for at least 7 days.
Public Overrides Function Validate(ByVal value As Object, ByVal cultureInfo As CultureInfo) As ValidationResult
Dim bg As BindingGroup = TryCast(value, BindingGroup)
' Get the source object.
Dim item As PurchaseItem = TryCast(bg.Items(0), PurchaseItem)
Dim doubleValue As Object = Nothing
Dim dateTimeValue As Object = Nothing
' Get the proposed values for Price and OfferExpires.
Dim priceResult As Boolean = bg.TryGetValue(item, "Price", doubleValue)
Dim dateResult As Boolean = bg.TryGetValue(item, "OfferExpires", dateTimeValue)
If (Not priceResult) OrElse (Not dateResult) Then
Return New ValidationResult(False, "Properties not found")
End If
Dim price As Double = CDbl(doubleValue)
Dim offerExpires As Date = CDate(dateTimeValue)
' Check that an item over $100 is available for at least 7 days.
If price > 100 Then
If offerExpires < Date.Today + New TimeSpan(7, 0, 0, 0) Then
Return New ValidationResult(False, "Items over $100 must be available for at least 7 days.")
End If
End If
Return ValidationResult.ValidResult
End Function
End Class