Хорошо, я наконец-то понял, как с этим справиться.
Здесь нужно скопировать подтверждение из исходной привязки и отправить его в привязку Textbox.
Первое, что вам нужно сделать для достижения этой цели, - это реализовать интерфейс INotifyDataErrorInfo в вашем пользовательском элементе управления.Затем вам нужно будет проверить пользовательский элемент управления, чтобы получить точный текст проверки с помощью функции GetErrors (это можно сделать с помощью Validation.GetErrors ).
Это базовая реализация иэто в VB, но я уверен, что вы поняли.
Public Event ErrorsChanged(ByVal sender As Object, ByVal e As System.ComponentModel.DataErrorsChangedEventArgs) Implements System.ComponentModel.INotifyDataErrorInfo.ErrorsChanged
Public Function GetErrors(ByVal propertyName As String) As System.Collections.IEnumerable Implements System.ComponentModel.INotifyDataErrorInfo.GetErrors
Dim returnValue As System.Collections.IEnumerable = Nothing
Dim errorMessage As String = Nothing
If propertyName = "Value" Then
If Validation.GetErrors(Me).Count = 0 Then
errorMessage = ""
Else
errorMessage = Validation.GetErrors(Me).First.ErrorContent.ToString
End If
If String.IsNullOrEmpty(errorMessage) Then
returnValue = Nothing
Else
returnValue = New List(Of String)() From {errorMessage}
End If
End If
Return returnValue
End Function
Public ReadOnly Property HasErrors As Boolean Implements System.ComponentModel.INotifyDataErrorInfo.HasErrors
Get
Return Validation.GetErrors(Me).Any()
End Get
End Property
Следующее, что нужно сделать, это уведомить вас, что контроль становится недействительным.Вам придется сделать это в 2 местах.
Первый будет в событии BindingValidationError .Второй будет в функции Value PropertyChangedCallback (должен быть указан при регистрации DependencyProperty)
Public Shared ValueProperty As DependencyProperty = DependencyProperty.Register("Value", GetType(String), GetType(XDateTimePicker), New PropertyMetadata(Nothing, AddressOf ValuePropertyChangedCallback))
Public Shared Sub ValuePropertyChangedCallback(ByVal dependencyObject As DependencyObject, ByVal dependencyPropertyChangedEventArgs As DependencyPropertyChangedEventArgs)
DirectCast(dependencyObject, MyUserControl).NotifyErrorsChanged("Value")
End Sub
Private Sub MyUserControl_BindingValidationError(ByVal sender As Object, ByVal e As System.Windows.Controls.ValidationErrorEventArgs) Handles Me.BindingValidationError
Me.NotifyErrorsChanged("Value")
End Sub
Public Sub NotifyErrorsChanged(ByVal propertyName As String)
RaiseEvent ErrorsChanged(Me, New System.ComponentModel.DataErrorsChangedEventArgs(propertyName))
End Sub
Большая часть работы уже выполнена, но вам все еще нужно выполнитьнекоторые корректировки привязок.
При создании привязки TextBox необходимо установить для NotifyOnValidationError значение False, чтобы избежать цикла уведомлений между исходной привязкой и привязкой Textbox. ValidatesOnExceptions , ValidatesOnDataErrors и ValidatesOnNotifyDataErrors необходимо установить в значение True.
Dim binding As New System.Windows.Data.Binding
binding.Source = Me
binding.Path = New System.Windows.PropertyPath("Value")
binding.Mode = Data.BindingMode.TwoWay
binding.NotifyOnValidationError = False
binding.ValidatesOnExceptions = True
binding.ValidatesOnDataErrors = True
binding.ValidatesOnNotifyDataErrors = True
Me.TextBox1.SetBinding(TextBox.TextProperty, binding)
В заключение вам необходимо установить NotifyOnroralalid и ValidatesOnNotifyDataErrors свойство True в вашем XAML.
<uc:MyUserControl x:Name="UC" Value="{Binding Path=Value, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnNotifyDataErrors=True}" Height="20" Width="100" />