WPF数据绑定验证被忽略

5

我相信我按照教科书上的方式连接了DataBinding验证,但它根本不起作用。

在调试器中,Validate(object value, CultureInfo cultureInfo)方法从未被调用。

这是怎么回事?此外,对于调试WPF的任何提示都将非常棒。

我将发布我的XAML和相关类。

<UserControl x:Class="FooControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:Foo.Controls"
         mc:Ignorable="d" 
         d:DesignWidth="300">
<Grid Name="GridFoo">
    <Grid.Resources>
        <local:ValueConverter x:Key="MyConverter" />
    </Grid.Resources>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>
    <TextBox Name="TextBoxScalar" Grid.Column="0" TextAlignment="Right">
        <TextBox.Text>
            <Binding Mode="OneWay" Path="Scalar" NotifyOnValidationError="True" ValidatesOnDataErrors="True" ValidatesOnExceptions="True">
                <Binding.ValidationRules>
                    <local:ScalarValidationRule />
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>
    </TextBox>
    <TextBlock Name="TextBlockUnit" Grid.Column="1" TextAlignment="Left" Padding="3">
        <Hyperlink>
            <!-- Use a custom converter here b/c generics break wpf... -->
            <Run Text="{Binding Mode=OneWay, Path=Unit, Converter={StaticResource MyConverter}}" />
        </Hyperlink>
    </TextBlock>
</Grid>

验证规则

public class ScalarValidationRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        string number = value as string;
        double d;
        return new ValidationResult(Double.TryParse(number, NumberStyles.Any, cultureInfo, out d),
            String.Format("\"{0}\" is not a number.", number));
    }
}
2个回答

9
您正在将ValidationRule添加到单向绑定中。单向绑定从不将值推送到源,因此没有要验证的内容,您的ValidationRule永远不会被调用。如果您想验证用户输入的数据,请在绑定上设置Mode="TwoWay"。您也可以完全省略Mode属性,因为TextBox.Text默认进行双向绑定。
如果您确实想要一个单向绑定,并且希望在从源(Scalar)推送值到目标(TextBox.Text)时进行验证,则在ValidationRule上将ValidatesOnTargetUpdated设置为True。您可以在XAML中或ValidationRule类的构造函数中执行此操作。

0

您不需要指定绑定模式。根据您的需求,将ValidatesOnTargetUpdated设置为false/true,因为两者都可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接