您可以将验证规则附加到文本框的绑定上,以检查值是否为有效的double类型。这将防止用户能够按下“提交”按钮,除非输入了有效的值,从而消除了您在提交时检查DoubleProperty值是否有效的需求,因为只有在提交按钮启用时它才是有效的。以下是一个简单的示例:
<TextBox HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" VerticalAlignment="Top" Width="120">
<TextBox.Text>
<Binding Path="DoubleProperty">
<Binding.ValidationRules>
<validationrules:NumberValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
在上面的例子中,您需要定义一个继承自ValidationRule的NumberValidationRule类。以下是一个NumberValidationRule示例。
public class NumberValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
double result = 0.0;
bool canConvert = double.TryParse(value as string, out result);
return new ValidationResult(canConvert, "Not a valid double");
}
}
如果您添加了一个验证规则,那么如果您的ValidationRule类说它不是有效值,文本框将在文本字段上引发错误。
为了防止提交按钮被启用,您可以向其添加一个CanExecute事件,该事件检查WPF窗口是否有效。 如下所示:
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Save" CanExecute="Save_CanExecute" Executed="Save_Executed"/>
</Window.CommandBindings>
... The rest of your page
<Button Content="Save" HorizontalAlignment="Left" Margin="43,146,0,0" VerticalAlignment="Top" Width="75" Command="ApplicationCommands.Save"/>
并且在代码后台执行
private void Save_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = IsValid(sender as DependencyObject);
}
private bool IsValid(DependencyObject obj)
{
return !Validation.GetHasError(obj) && LogicalTreeHelper.GetChildren(obj).OfType<DependencyObject>().All(IsValid);
}
这里是一个更详细的例子:
WPF中的验证