2010-07-20 87 views
3

我(相信)我以教科书的方式接线DataBinding验证,但它根本不工作 - 完全没有。WPF 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)); 
    } 
} 

回答

7

要添加的有效性规则的单向绑定。单向绑定从不向源发送值,所以没有什么可以验证,而且您的验证规则永远不会被调用。如果您想验证用户输入的数据,请在您的绑定上设置Mode="TwoWay"。您也可以完全省略模式属性,因为默认情况下TextBox.Text是双向绑定的。

如果确实需要单向绑定,并且希望在将值从源(标量)推送到目标(TextBox.Text)时进行验证,则在ValidationRule上将ValidatesOnTargetUpdated设置为True。您可以在XAML中或在ValidationRule类的构造函数中执行此操作。

+0

提问并回答。谢谢。 – pomeroy 2010-07-21 13:14:56

+1

即使经过了很长一段时间,好的答案也是很好的:) – Koscik 2014-03-24 09:59:12

0

您不需要指定绑定模式。并根据您的要求将ValidatesOnTargetUpdated设置为false/true,因为两者都适用。