2013-02-11 48 views
1

我想在按下某个键时验证文本框中的文本。这里是最短的代码示例显示了我想要做的事:UpdateSourceTrigger不工作?

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <TextBox FontSize="15" HorizontalAlignment="Left" Name="txtEmail" VerticalAlignment="Top" Width="135" 
       Text="{Binding ValidationRules.EmailAddress, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}"/> 
    </Grid> 
</Window> 

“ValidationRules”类:

当我开始在文本框中键入,我不明白“设置”作为控制台输出,尽管我使用的是UpdateSourceTrigger=PropertyChanged。我已经完成了我的研究,但我能找到的所有例子都是漫长而混乱的。如果你能指出我在验证过程中遇到的其他错误,我也会很感激,但如果可能,请尝试用简单的术语来解释,因为我是WPF的新手。

+0

是在即时窗口,有什么错误? – alu 2013-02-11 23:53:26

+0

你在哪里设置'DataContext'到'ValidationRules'类 – 2013-02-12 00:00:45

回答

2

它必须是您设置DataContext的位置的问题。

这个例子似乎很好地工作:

代码:

public partial class MainWindow : Window, INotifyPropertyChanged 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     ValidationRules = new ValidationRules(); 
    } 

    private ValidationRules _validation; 
    public ValidationRules ValidationRules 
    { 
     get { return _validation; } 
     set { _validation = value; NotifyPropertyChanged("ValidationRules"); } 
    } 


    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 
} 

public class ValidationRules : INotifyPropertyChanged 
{ 
    string email = ""; 
    public string EmailAddress 
    { 
     get 
     { 
      return email; 
     } 

     set 
     { 
      Console.WriteLine("Setting!"); 
      //Only check if there is any text for now... 
      if (String.IsNullOrWhiteSpace(value)) 
      { 
       throw new Exception(); 
      } 
      email = value; 
      NotifyPropertyChanged("EmailAddress"); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 

} 

的XAML

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Class="WpfApplication1.MainWindow" 
     Title="MainWindow" Height="125.078" Width="236.441" x:Name="UI" > 
    <Grid DataContext="{Binding ElementName=UI}"> 
     <TextBox FontSize="15" HorizontalAlignment="Left" Name="txtEmail" VerticalAlignment="Top" Width="135" 
       Text="{Binding ValidationRules.EmailAddress, ValidatesOnExceptions=True, UpdateSourceTrigger=PropertyChanged}"/> 
    </Grid> 
</Window> 
+0

谢谢。但是,当我使用“抛出新的Exception()”时,它会暂停执行(“异常未被用户代码处理”)。是否有一些你可以抛出的错误,但是仍然没有达到预期的效果,还是有另一种方法去做? – Harry 2013-02-12 10:38:40