gpt4 book ai didi

wpf - 如何跳过对禁用元素的验证?

转载 作者:行者123 更新时间:2023-12-04 19:04:34 26 4
gpt4 key购买 nike

我是 WPF 的新手。在我们当前的项目中,我们为所有需要验证的数据输入字段添加了验证规则。我们还复制了递归循环所有绑定(bind)及其验证规则的代码(也在 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()IsEnabledPropertyparent 的依赖属性,但到目前为止我的尝试都失败了。谁能帮我解决这个问题,或者这不是解决这个问题的正确思路?

或者,我一直在考虑在禁用该字段时将验证错误绑定(bind)到“忽略任何内容”规则,但这对我来说似乎更麻烦。

我试过设置 Binding.NotifyOnValidationError通过 XAML 中的绑定(bind),绑定(bind)到元素的 IsEnabled 的相同值和 NotifyOnValidationError但我不能那样做,因为它不是 DependencyProperty。

我尝试的另一件事是添加属性 ElementIsEnabled在验证类中,确实能够在 XAML 中执行类似的操作:


<Binding.ValidationRules>
<local:MustContainInteger ElementIsEnabled="{Binding SameBindingAsIsEnabled}" />
</Binding.ValidationRules>

但这也失败了,因为 ElementIsEnabled不是 DependencyObject 上的 DependencyProperty。

无论如何,我们将不胜感激。

最佳答案

在 .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>

这当然允许您在 Validate 中检查 Element.IsEnabled

关于wpf - 如何跳过对禁用元素的验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1901653/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com