Я довольно новичок в WPF. В нашем текущем проекте мы добавили правила проверки для всех полей ввода данных, для которых нам нужна проверка. Мы также скопировали код (также размещенный в другом месте здесь в stackoverflow), который рекурсивно зацикливается на всех привязках и их правилах проверки, чтобы узнать, все ли данные действительны перед сохранением данных.
Это наш код, который, я думаю, является местом для решения нашей проблемы:
Public Function ValidateBindings(ByVal parent As DependencyObject) As Boolean
Dim valid As Boolean = True
Dim localValues As LocalValueEnumerator = parent.GetLocalValueEnumerator
While localValues.MoveNext
Dim entry As LocalValueEntry = localValues.Current
If BindingOperations.IsDataBound(parent, entry.Property) Then
Dim binding As Binding = BindingOperations.GetBinding(parent, entry.Property)
For Each rule In binding.ValidationRules
Dim result As ValidationResult = rule.Validate(parent.GetValue(entry.Property), Nothing)
If Not result.IsValid Then
Dim expression As BindingExpression = BindingOperations.GetBindingExpression(parent, entry.Property)
Validation.MarkInvalid(expression, New ValidationError(rule, expression, result.ErrorContent, Nothing))
valid = False
End If
Next
End If
End While
For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(parent) - 1
Dim child As DependencyObject = VisualTreeHelper.GetChild(parent, i)
If Not ValidateBindings(child) Then
valid = False
End If
Next
Return valid
End Function
Я пытался выяснить, как использовать GetValue()
для свойства IsEnabledProperty
зависимостей parent
, но мои попытки пока не увенчались успехом.
Кто-нибудь может мне помочь с этим или с этим не правильным мышлением, чтобы решить эту проблему?
В качестве альтернативы, я играл с мыслью о привязке ошибки проверки к правилу «игнорировать любой контент», когда поле отключено, но мне кажется, что это больше проблем.
Я пытался установить Binding.NotifyOnValidationError
через Binding в XAML, чтобы привязать к одному и тому же значению для IsEnabled
и NotifyOnValidationError
элемента, но я не могу этого сделать, поскольку это не DependencyProperty.
Еще одна вещь, которую я пытался добавить, - добавить свойство ElementIsEnabled
в класс проверки, сделать что-то подобное в XAML:
<Binding.ValidationRules>
<local:MustContainInteger ElementIsEnabled="{Binding SameBindingAsIsEnabled}" />
</Binding.ValidationRules>
Но это также не помогает, поскольку ElementIsEnabled
не является свойством DependencyProperty для объекта DependencyObject.
В любом случае, любая помощь по этому вопросу будет принята с благодарностью.