Как я могу получить исходное значение, если моя привязка данных не проходит проверку - PullRequest
1 голос
/ 21 июня 2011

У меня есть рабочее диалоговое окно WPF, которое использует DataGrid.В DataGrid установлено значение ItemsSource={Binding SomeCollection, Mode=TwoWay}.Эта установка работает нормально, я могу читать значения и обновлять их из пользовательского интерфейса.Позже я добавил конвертеры для проверки значений.Я показываю пустым, когда проверка не проходит.Теперь я заинтересован в том, чтобы вернуть исходные значения в случае неудачной проверки.

Какие у меня есть варианты?

1 Ответ

6 голосов
/ 21 июня 2011

Я никогда не использовал конвертер для проверки. Вместо этого я использую элементы, которые реализуют 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>

Наконец: Статья MSDN о внедрении валидации

Видео с ним. Видео № 4

...