2010-07-20 81 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,因爲兩者都適用。