强制验证WPF中的绑定控件

Val*_*yev 56 validation wpf business-objects

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

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

是否可以强制进行验证检查并确定某些验证规则是否已损坏?

当用户试图关闭对话框并禁止他执行此操作时,如果任何验证规则被破坏,我将能够执行此操作.

谢谢.

Ken*_*ith 69

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

像这样工作:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 这个属性真的很棒,很简单,完全符合我们的需要. (3认同)
  • 它可能会导致性能问题。示例 - 具有 &gt;=1000 行的网格,其中每一行的验证都会向数据库发出 &gt;=1 次请求。设置 DataContext 后,将验证每一行,并将向数据库发出 &gt;=1000 个请求。此外,如果验证包含某种内存泄漏,它将乘以 &gt;=1000。 (2认同)
  • 这应该被选为答案,因为它在 MVVM 上下文中更合适。 (2认同)

Rob*_*nee 63

我们的申请中也有这个问题.验证仅在绑定更新时触发,因此您必须手动更新它们.我们在Window的Loaded事件中执行此操作:

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();
}
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

  • 这可以实现我想要的,但我没有代码隐藏.表单逻辑封装在ModelView中.由于ModelView不应该引用特定的屏幕元素,如何做到这一点并且仍然没有代码隐藏?XAML中是否有办法强制绑定? (9认同)
  • 这违反了标准的UI准则。仅当用户单击“保存”时,空白表单才应显示多个验证错误,并且还可以选择将其逐一显示(当用户在“字段”中选择“出”)。您应该在保存之前而不是在加载之后执行此操作。 (2认同)