<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:WpfApplication1"
x:Class="WpfApplication1.Window1">
<Window.Resources>
<c:MyDataSource x:Key="ods"/>
<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>
</Window.Resources>
<StackPanel>
<TextBox Name="textBox3" Width="50" FontSize="15"
Validation.ErrorTemplate="{StaticResource validationTemplate}"
Style="{StaticResource textBoxInError}">
<TextBox.Text>
<Binding Path="Age3" Source="{StaticResource ods}" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<ExceptionValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<CheckBox Name="cb" Checked="UseCustomHandler" Unchecked="DisableCustomHandler">Enable Custom Handler (see ToolTip)</CheckBox>
</StackPanel>
</Window>
//File:Window.xaml.vb
Imports System
Imports System.ComponentModel
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Documents
Imports System.Windows.Navigation
Imports System.Windows.Shapes
Imports System.Windows.Data
Imports System.Globalization
Imports System.Collections.ObjectModel
Namespace WpfApplication1
Public Partial Class Window1
Inherits Window
Public Sub New()
InitializeComponent()
End Sub
Private Sub UseCustomHandler(sender As Object, e As RoutedEventArgs)
Dim myBindingExpression As BindingExpression = textBox3.GetBindingExpression(TextBox.TextProperty)
Dim myBinding As Binding = myBindingExpression.ParentBinding
myBinding.UpdateSourceExceptionFilter = New UpdateSourceExceptionFilterCallback(AddressOf ReturnExceptionHandler)
myBindingExpression.UpdateSource()
End Sub
Private Sub DisableCustomHandler(sender As Object, e As RoutedEventArgs)
Dim myBinding As Binding = BindingOperations.GetBinding(textBox3, TextBox.TextProperty)
myBinding.UpdateSourceExceptionFilter = DirectCast([Delegate].Remove(myBinding.UpdateSourceExceptionFilter, New UpdateSourceExceptionFilterCallback(AddressOf ReturnExceptionHandler)), UpdateSourceExceptionFilterCallback)
BindingOperations.GetBindingExpression(textBox3, TextBox.TextProperty).UpdateSource()
End Sub
Private Function ReturnExceptionHandler(bindingExpression As Object, exception As Exception) As Object
Return "This is from the UpdateSourceExceptionFilterCallBack."
End Function
End Class
Public Class AgeRangeRule
Inherits ValidationRule
Private _min As Integer
Private _max As Integer
Public Sub New()
End Sub
Public Property Min() As Integer
Get
Return _min
End Get
Set
_min = value
End Set
End Property
Public Property Max() As Integer
Get
Return _max
End Get
Set
_max = value
End Set
End Property
Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult
Dim age As Integer = 0
Try
If DirectCast(value, String).Length > 0 Then
age = Int32.Parse(DirectCast(value, [String]))
End If
Catch e As Exception
Return New ValidationResult(False, "Illegal characters or " & e.Message)
End Try
If (age < Min) OrElse (age > Max) Then
Return New ValidationResult(False, "Please enter an age in the range: " & Min & " - " & Max & ".")
Else
Return New ValidationResult(True, Nothing)
End If
End Function
End Class
Public Class MyDataSource
Private _age As Integer
Private _age2 As Integer
Private _age3 As Integer
Public Sub New()
Age = 0
Age2 = 0
End Sub
Public Property Age() As Integer
Get
Return _age
End Get
Set
_age = value
End Set
End Property
Public Property Age2() As Integer
Get
Return _age2
End Get
Set
_age2 = value
End Set
End Property
Public Property Age3() As Integer
Get
Return _age3
End Get
Set
_age3 = value
End Set
End Property
End Class
End Namespace
|