如何跳过已禁用元素的验证?

时间:2009-12-14 15:43:31

标签: wpf validation data-binding

我是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.NotifyOnValidationErrorIsEnabled的相同值,但我不能这样做,因为它不是的DependencyProperty。

我尝试的另一件事是在验证类中添加属性NotifyOnValidationError,可以在XAML中执行类似的操作:

ElementIsEnabled

但是这也失败了,因为 <Binding.ValidationRules> <local:MustContainInteger ElementIsEnabled="{Binding SameBindingAsIsEnabled}" /> </Binding.ValidationRules> 不是DependencyObject上的DependencyProperty。

无论如何,对此的任何帮助将不胜感激。

1 个答案:

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