Метод, который я использовал, заключается в создании различных стилей, в которые встроена моя пользовательская проверка.Тогда это просто вопрос назначения надлежащего стиля во время выполнения, который содержит необходимую проверку.
РЕДАКТИРОВАТЬ
Ниже приведен базовый пример, который создает стиль с именемNumericTextBox:
<Style x:Key="NumericTextBox">
<Setter Property="TextBox.VerticalAlignment"
Value="Stretch"/>
<Setter Property="TextBox.VerticalContentAlignment"
Value="Center"/>
<Setter Property="TextBox.Height"
Value="24"/>
<Setter Property="TextBox.Margin"
Value="0,2,0,2"/>
<EventSetter Event="UIElement.PreviewTextInput"
Handler="tbx_DigitCheck"/>
<EventSetter Event="UIElement.PreviewKeyDown"
Handler="tbx_OtherCharCheck"/>
<EventSetter Event="UIElement.PreviewDragEnter"
Handler="tbx_PreviewDragEnter"/>
</Style>
Следующий метод помещается в файл с выделенным кодом для словаря ресурсов, в котором хранится стиль.Этот метод гарантирует, что в текстовое поле можно вводить только цифры и действительный десятичный разделитель.Каждый символ проверяется на предмет недействительности, прежде чем он будет отображаться в текстовом поле.
Public Sub tbx_DigitCheck(ByVal sender As Object, _
ByVal e As TextCompositionEventArgs)
//Retireve the sender as a textbox.
Dim tbx As TextBox = CType(sender, TextBox)
Dim val As Short
//Get the current decimal separator.
Dim dSep As String = Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
//Check to make sure that a decimal separator character has not
//already been entered in the textbox. Only make this check
//for areas of the text that are not selected.
If e.Text = dSep And tbx.SelectedText.Contains(dSep) Then
//Do Nothing. Allow the character to be typed.
ElseIf e.Text = dSep And tbx.Text.Contains(dSep) Then
e.Handled = True
End If
//Only allow the decimal separator and numeric digits.
If Not Int16.TryParse(e.Text, val) And Not e.Text = dSep Then
e.Handled = True
End If
End Sub