TextBox with UpdateSourceExceptionFilter handler
<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