WPF INotifyErrorInfo Validation.Error事件未提升

时间:2017-01-16 15:33:24

标签: wpf vb.net validation

我遇到了一个奇怪的问题。尽管设置正确,但Validation.Error不会被触发。

以下是详细信息:

<DataTemplate x:Key="dtLateComers">
     <TextBox  Text="{Binding ParticipantTag, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True, NotifyOnSourceUpdated=True}" Validation.Error="Validation_Error" >
</DataTemplate>

代码隐藏(VB.Net)以设置HeaderedItemsControl的ItemsSource:

hicLateComers.ItemsSource = _LateComersViewModels

_LateComersViewModels是ObservableCollection(Of ParticipantViewModel)

ParticipantViewMode的实施:

Public Class ParticipantViewModel
Implements INotifyPropertyChanged, IDataErrorInfo

 Private _ParticipantTag As String = ""

Public Property ParticipantTag() As String
    Get
        Return _ParticipantTag
    End Get
    Set(ByVal value As String)
        _ParticipantTag = value
        _ParticipantTag= _ParticipantTag.ToUpper      

        NotifyPropertyChanged("ParticipantTag")
    End Set
End Property

 Public ReadOnly Property Item(byVal columnName As String) As String Implements IDataErrorInfo.Item
    Get
        Dim errorString As String = String.Empty

        If columnName.Equals("ParticipantTag") Then

            If not ParticipantValidationManager.IsValidKeypadTag(_ParticipantTag, True) then
                errorString = "Incorrect entry. Please try again."
            End If
        End If

        Return errorString
    End Get
End Property

Public ReadOnly Property [Error] As String Implements IDataErrorInfo.Error
    Get
        Throw New NotImplementedException()
    End Get
End Property

End Class

问题 当我设置ItemSource属性(如上面的代码中所述)时,Item索引的调用次数与_LaterComersViewModels中的项目一样多。验证工作,因此我在TextBox旁边得到红色圆圈。但是,在我开始在Textbox中输入之前,Validation_Error永远不会被触发。键入TextBox会更改Property绑定到它并验证它。基于验证Validation.Error事件被引发,并由应用程序处理。在该事件处理程序中,我保持错误计数。

所以问题是,为什么在初始数据绑定期间一个/多个项目在验证规则上失败时,不会引发Validation.Error?虽然通过键入TextBox来改变属性,但它确实会被提升。

随意分享任何想法,假设或解决方案。任何类型的帮助将不胜感激。感谢。

附注:我有一个简单的C#应用​​程序,它不使用数据模板。在该应用程序中,Validation.Error事件在启动时完全引发,并在属性更改时引发。虽然在该应用程序中,Model绑定到Grid的DataContext属性。

1 个答案:

答案 0 :(得分:1)

由于Validation.Error是一个附加事件,你可以在HeaderedItemsControl上挂钩事件处理程序:

<HeaderedItemsControl x:Name="hicLateComers" ItemTemplate="{StaticResource dtLateComers}" Validation.Error="Validation_Error" />

结果应该几乎相同,因为您可以在事件处理程序中轻松访问TextBox和ParticipantViewModel对象:

Private Sub Validation_Error(sender As Object, e As ValidationErrorEventArgs)
    Dim textBox = CType(e.OriginalSource, TextBox)
    Dim participant = CType(textBox.DataContext, ParticipantViewModel)

    '...
End Sub