如果我的数据绑定验证失败,我怎样才能获得原始值

时间:2011-06-21 16:19:50

标签: wpf data-binding datagrid

我有一个使用DataGrid的工作WPF对话框。 DataGrid设置为ItemsSource={Binding SomeCollection, Mode=TwoWay}。此设置工作正常,我可以读取值并从UI更新它们。

后来我添加了转换器来验证值。验证失败时显示空白。现在我有兴趣恢复原始值,以防验证失败。

我有什么选择?

1 个答案:

答案 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>

最后: A MSDN article on implementing Validation

A video to go with it.视频编号4