我對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
我試圖找出如何在parent
的IsEnabledProperty
依賴屬性使用GetValue()
,但我嘗試這樣遠未失敗。 任何人都可以幫助我解決這個問題或這不是正確的思維方式?
另外,我一直在玩弄把驗證錯誤綁定到「忽略任何內容」的想法 - 當禁用字段時,規則,但對我來說似乎更麻煩。
我試圖設置Binding.NotifyOnValidationError
通過XAML綁定,綁定到爲同一值的元素的IsEnabled
和NotifyOnValidationError
,但我不能這樣做,因爲它不是一個DependencyProperty。
另一件事我想是在驗證類添加屬性ElementIsEnabled
,也能夠做到在XAML是這樣的:
<Binding.ValidationRules>
<local:MustContainInteger ElementIsEnabled="{Binding SameBindingAsIsEnabled}" />
</Binding.ValidationRules>
但還是失敗,因爲ElementIsEnabled
是不是在DependencyObject的一個DependencyProperty 。
無論如何,任何幫助將不勝感激。