我有几个文本框,我想强制执行某些规则。例如,我有一个绑定到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属性就会停止更新。不幸的是,它仍然包含该无效字符之前的所有内容,我想阻止用户保存该名称(通过按下完成按钮),只有几个有效字符而不是他想要输入的全名。
答案 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>
如果需要,您可以指定更多条件。