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

时间:2014-04-01 20:02:41

标签: c# wpf validation textbox

我有几个文本框,我想强制执行某些规则。例如,我有一个绑定到Name属性的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>

还有一个&#34; Done&#34;按钮,我想如果名称文本框中有无效字符,应该禁用该按钮或单击时,会出现一个弹出窗口,告诉用户有无效字符。

现在,我所做的代码只会在文本框中以红色突出显示这些字符。如果在文本框中找到无效字符,我怎么能够禁用该按钮?

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

1 个答案:

答案 0 :(得分:1)

如果您为文本框命名nameTextBox,那么它将是:

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

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