我是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()
的{{1}}依赖项属性上使用IsEnabledProperty
,但到目前为止我的尝试都失败了。
任何人都可以帮我解决这个问题吗?
或者,我一直在玩这个想法,在禁用该字段时将验证错误绑定到“忽略任何内容” - 规则,但对我来说似乎更麻烦。
我试图通过XAML中的Binding设置parent
,以绑定到元素的Binding.NotifyOnValidationError
和IsEnabled
的相同值,但我不能这样做,因为它不是的DependencyProperty。
我尝试的另一件事是在验证类中添加属性NotifyOnValidationError
,可以在XAML中执行类似的操作:
ElementIsEnabled
但是这也失败了,因为
<Binding.ValidationRules>
<local:MustContainInteger ElementIsEnabled="{Binding SameBindingAsIsEnabled}" />
</Binding.ValidationRules>
不是DependencyObject上的DependencyProperty。
无论如何,对此的任何帮助将不胜感激。
答案 0 :(得分:5)
在.NET 4中,您现在可以通过x:Reference
在ValidationRule中获取对元素的引用:
public class MustContainInteger : ValidationRule
{
public UIElement Element { get; set; }
// ...
}
<TextBox Name="testtb">
<TextBox.Resources>
<!-- Definition in resources necessary because of cyclical dependency -->
<vr:MustContainInteger x:Key="Rule" Element="{x:Reference testtb}" />
</TextBox.Resources>
<TextBox.Text>
<Binding Path="TestString">
<Binding.ValidationRules>
<StaticResource ResourceKey="Rule" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
这当然可以让您检查Element.IsEnabled
中的Validate
。