我遇到了一个奇怪的问题。尽管设置正确,但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属性。
答案 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