首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在WPF中对绑定控件进行强制验证

在WPF中对绑定控件进行强制验证
EN

Stack Overflow用户
提问于 2009-01-27 13:40:34
回答 6查看 49.6K关注 0票数 65

我有一个WPF对话框,上面有几个文本框。Textboxes绑定到我的业务对象,并附加了WPF验证规则。

问题是,用户可以完美地单击“确定”按钮并关闭对话框,而无需实际将数据输入到文本框中。验证规则从不触发,因为用户甚至没有尝试将信息输入到文本框中。

是否可以强制执行验证检查并确定是否违反了某些验证规则?

当用户试图关闭对话框时,我可以这样做,如果违反了任何验证规则,则禁止他这样做。

谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-01-30 19:28:22

在我们的应用程序中也有这个问题。验证仅在绑定更新时触发,因此您必须手动更新它们。我们在窗口的Loaded事件中执行此操作:

代码语言:javascript
复制
public void Window_Loaded(object sender, RoutedEventArgs e)
{
    // we manually fire the bindings so we get the validation initially
    txtName.GetBindingExpression(TextBox.TextProperty).UpdateSource();
    txtCode.GetBindingExpression(TextBox.TextProperty).UpdateSource();
}

这将使错误模板(红色轮廓)出现,并设置Validation.HasError属性,我们已触发OK按钮将其禁用:

代码语言:javascript
复制
<Button x:Name="btnOK" Content="OK" IsDefault="True" Click="btnOK_Click">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Setter Property="IsEnabled" Value="false" />
            <Style.Triggers>
                <!-- Require the controls to be valid in order to press OK -->
                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding ElementName=txtName, Path=(Validation.HasError)}" Value="false" />
                        <Condition Binding="{Binding ElementName=txtCode, Path=(Validation.HasError)}" Value="false" />
                    </MultiDataTrigger.Conditions>
                    <Setter Property="IsEnabled" Value="true" />
                </MultiDataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>
票数 68
EN

Stack Overflow用户

发布于 2009-03-21 06:49:07

在3.5SP1 / 3.0SP2中,他们还向ValidationRule基础添加了一个新属性,即ValidatesOnTargetUpdated="True"。这将在绑定源对象时立即调用验证,而不是仅在目标控件更新时调用。这可能不是你想要的,但最初看到你需要修复的所有东西并不是坏事。

其工作原理如下:

代码语言:javascript
复制
<TextBox.Text>
    <Binding Path="Amount" StringFormat="C">
        <Binding.ValidationRules>
            <validation:RequiredValidationRule 
                ErrorMessage="The pledge amount is required." 
                ValidatesOnTargetUpdated="True"  />
            <validation:IsNumericValidationRule 
                ErrorMessage="The pledge amount must be numeric." 
                ValidationStep="ConvertedProposedValue" 
                ValidatesOnTargetUpdated="True"  />
        </Binding.ValidationRules>
    </Binding>
</TextBox.Text>
票数 75
EN

Stack Overflow用户

发布于 2016-06-25 07:00:53

这里有一种不需要调用"UpdateSource()“或”UpdateTarget()“的替代方法:

代码语言:javascript
复制
var binding = thingToValidate.GetBinding(propertyToValidate);
foreach (var rule in binding.ValidationRules)
{
    var value = thingToValidate.GetValue(propertyToValidate);
    var result = rule.Validate(value, CultureInfo.CurrentCulture);
    if (result.IsValid) 
         continue;
    var expr = BindingOperations.GetBindingExpression(thingToValidate, propertyToValidate);
    if (expr == null)  
        continue;
    var validationError = new ValidationError(rule, expr);
    validationError.ErrorContent = result.ErrorContent;
    Validation.MarkInvalid(expr, validationError);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/483419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档