我有一个使用DataGrid的工作WPF对话框。 DataGrid设置为ItemsSource={Binding SomeCollection, Mode=TwoWay}
。此设置工作正常,我可以读取值并从UI更新它们。
后来我添加了转换器来验证值。验证失败时显示空白。现在我有兴趣恢复原始值,以防验证失败。
我有什么选择?
答案 0 :(得分:6)
我从未使用转换器进行验证。相反,我使用IDataErrorInfo实现的项目与数据绑定属性中的属性ValidatesOnDataErrors = True。
使用这种验证方法,保留原始值,对象返回错误值(在我的例子中是一个字符串,说明错误是什么)。 My View的控件有一个自定义验证项,它会添加一个随着时间的推移逐渐消失的红色边框,以及一个在鼠标悬停时弹出的工具提示。
然后,您只需将验证规则放在要显示的数据类中:
Private Sub OnAddress1Changed()
Me.RemoveError("Address1")
If _Address1 Is Nothing OrElse _Address1.Trim = "" Then
Me.AddError("Address1", "Please enter a valid Address Line")
End If
OnPropertyChanged("CanShip")
End Sub
Private m_validationErrors As New Dictionary(Of String, String)
Private Sub AddError(ByVal ColName As String, ByVal Msg As String)
If Not m_validationErrors.ContainsKey(ColName) Then
m_validationErrors.Add(ColName, Msg)
End If
End Sub
Private Sub RemoveError(ByVal ColName As String)
If m_validationErrors.ContainsKey(ColName) Then
m_validationErrors.Remove(ColName)
End If
End Sub
Public ReadOnly Property [Error]() As String Implements System.ComponentModel.IDataErrorInfo.Error
Get
If m_validationErrors.Count > 0 Then
Return "Shipment data is invalid"
Else
Return Nothing
End If
End Get
End Property
Default Public ReadOnly Property Item(ByVal columnName As String) As String Implements System.ComponentModel.IDataErrorInfo.Item
Get
If m_validationErrors.ContainsKey(columnName) Then
Return m_validationErrors(columnName).ToString
Else
Return Nothing
End If
End Get
End Property
只是为了它,我会在其中放置一个示例验证模板,向其他人展示如何将其连接起来。
<Style x:Key="ToolTipValidation" TargetType="{x:Type Control}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Border BorderBrush="Red" BorderThickness="2,1,2,1">
<AdornedElementPlaceholder/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="True">
<Setter Property="ToolTip" Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}"/>
</Trigger>
</Style.Triggers>
</Style>