我有一个WPF对话框,上面有几个文本框。Textboxes绑定到我的业务对象,并附加了WPF验证规则。
问题是,用户可以完美地单击“确定”按钮并关闭对话框,而无需实际将数据输入到文本框中。验证规则从不触发,因为用户甚至没有尝试将信息输入到文本框中。
是否可以强制执行验证检查并确定是否违反了某些验证规则?
当用户试图关闭对话框时,我可以这样做,如果违反了任何验证规则,则禁止他这样做。
谢谢。
发布于 2009-01-30 19:28:22
在我们的应用程序中也有这个问题。验证仅在绑定更新时触发,因此您必须手动更新它们。我们在窗口的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();
}
这将使错误模板(红色轮廓)出现,并设置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>
发布于 2009-03-21 06:49:07
在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>
发布于 2016-06-25 07:00:53
这里有一种不需要调用"UpdateSource()“或”UpdateTarget()“的替代方法:
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);
}
https://stackoverflow.com/questions/483419
复制相似问题