捕获已违反验证规则以阻止用户保存

本文关键字:用户 保存 规则 验证 | 更新日期: 2023-09-27 17:55:51

我有几个文本框,我想强制执行某些规则。例如,我有一个绑定到 Name 属性的"名称"文本框,但我不需要任何 |<或>该属性中存在的字符。为了做到这一点,我创建了以下从 ValidationRule 继承的类:

class NoInvalidCharsRule : ValidationRule
{
    private static char[] mInvalidChars = Path.GetInvalidPathChars();
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        String stringValue = value.ToString();
        foreach (char invalidChar in mInvalidChars)
        {
            if (stringValue.Contains(invalidChar))
            {
                return new ValidationResult(false, "Invalid characters are present in the string.");
            }
        }
        return new ValidationResult(true, "");
    }
}

并在我的 .xaml 中按如下方式绑定:

    <pres:OneTextBox Watermark="Name..." Margin="85,12,0,0"
                     AcceptsReturn="False" MaxLines="1" Height="22" VerticalAlignment="Top"
                     HorizontalAlignment="Left" Width="300" Style="{StaticResource ErrorStyleTextBox}">
        <Validation.ErrorTemplate>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                    <AdornedElementPlaceholder/>
                    <TextBlock DockPanel.Dock="Right" Foreground="Red" FontSize="20">!</TextBlock>
                </DockPanel>
            </ControlTemplate>
        </Validation.ErrorTemplate>
        <pres:OneTextBox.Text>
            <Binding Path="InterfaceSpecification.Name" UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True" >
                <Binding.ValidationRules>
                    <interfaceSpecsModule:NoInvalidCharsRule ValidationStep="RawProposedValue" />
                </Binding.ValidationRules>
            </Binding>
        </pres:OneTextBox.Text>
    </pres:OneTextBox>

还有一个"完成"按钮,我希望如果"名称"文本框中有无效字符,则应禁用该按钮,或者在单击时出现一个弹出窗口,告诉用户存在无效字符。

目前,如果存在此类字符,我所做的代码仅以红色突出显示文本框。如果在文本框中找到无效字符,如何禁用该按钮?

编辑:我知道一旦在文本框中写入了无效字符,Name 属性就会停止更新。不幸的是,它仍然包含该无效字符之前的所有内容,我想阻止用户仅使用几个有效字符而不是他打算输入的全名来保存该名称(通过按完成按钮)。

捕获已违反验证规则以阻止用户保存

假设您将文本框命名为TextBox,它将是:

<Button Name="doneButton" Content="Done" IsDefault="True">
  <Button.Style>
    <Style TargetType="{x:Type Button}">
      <Setter Property="IsEnabled" Value="false" />
      <Style.Triggers>
        <MultiDataTrigger>
          <MultiDataTrigger.Conditions>
            <Condition Binding="{Binding ElementName=nameTextBox, Path=(Validation.HasError)}" Value="false" />
          </MultiDataTrigger.Conditions>
          <Setter Property="IsEnabled" Value="true" />
        </MultiDataTrigger>
      </Style.Triggers>
    </Style>
  </Button.Style>
</Button>

如果需要,可以指定更多条件。