2011-05-03 38 views
0

有什麼不對這些代碼時,Validation.Error是從來沒有發射,而我setthe和NotifyOnValidationError屬性。因此,該方法 「Grid_Error(對象發件人,ValidationErrorEventArgs E)」 永遠不會執行,但我不知道爲什麼:(WPF有效性規則和Validation.Error不會引發事件

<Window xmlns:my="clr-namespace:WpfDigitalClock;assembly=WpfDigitalClock" x:Class="WpfApplication1.MainWindow" 
    xmlns:local="clr-namespace:WpfApplication1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Window.Resources> 
    <local:Names x:Key="MyNames" /> 
</Window.Resources> 
<Grid Validation.Error="Grid_Error"> 
    <TextBox Height="21" Margin="12,62,0,0" Name="TextBox1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="120"> 
     <TextBox.Text> 
      <Binding Source="{StaticResource MyNames}" Path="FirstName" NotifyOnValidationError="True"> 
       <Binding.ValidationRules> 
        <local:StringValidator /> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
    <TextBox Height="21" HorizontalAlignment="Right" Margin="0,62,12,0" Name="TextBox2" VerticalAlignment="Top" Width="120" > 
     <TextBox.Text> 
      <Binding Source="{StaticResource MyNames}" Path="LastName" NotifyOnValidationError="True"> 
       <Binding.ValidationRules> 
        <local:StringValidator /> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 
    <Button HorizontalAlignment="Left" Margin="35,122,0,116" Name="Button1" Width="75" Click="Button1_Click">Back</Button> 
    <Button HorizontalAlignment="Right" Margin="0,122,34,117" Name="Button2" Width="75" Click="Button2_Click">Forward</Button> 
    <Button Height="22" Margin="101,0,101,56" Name="Button3" VerticalAlignment="Bottom" Click="Button3_Click">Add</Button> 
</Grid> 

在Window1.xaml.cs文件

public class StringValidator : ValidationRule 
{ 
    public override ValidationResult Validate(object value, 
     System.Globalization.CultureInfo cultureinfo) 
    { 
     string aString = value.ToString(); 
     if (aString == "") 
      return new ValidationResult(false, "String cannot be null"); 
     return new ValidationResult(true, null); 
    } 
} 

private void Grid_Error(object sender, ValidationErrorEventArgs e) 
{ 
    if(e.Action == ValidationErrorEventAction.Added) 
     MessageBox.Show(e.Error.ErrorContent.ToString()); 
} 

謝謝您的幫助

編輯:

這裏我的名字類別:

class Names : ObservableCollection<Name> 
{ 
    public Names() 
    { 
     Name aName = new Name("FirstName " + (this.Count +1).ToString(), 
      "LastName " + (this.Count + 1).ToString()); 

     this.Add(aName); 
    } 
} 

這裏我的名類:

class Name : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private string _firstName; 
    private string _lastName; 


    public Name(string fName, string lName) 
    { 
     _firstName = fName; 
     _lastName = lName; 
    } 

    public string FirstName 
    { 
     get 
     { 
      return _firstName; 
     } 
     set 
     { 
      _firstName = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("FirstName")); 
     } 
    } 
    public string LastName 
    { 
     get 
     { 
      return _lastName; 
     } 
     set 
     { 
      _lastName = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("LastName")); 
     } 
    } 
} 
+0

文本框是否顯示錯誤(默認情況下爲紅色邊框)? – 2011-05-03 08:47:20

+0

什麼都沒有出現...... :( – Florian 2011-05-03 08:57:06

+0

你怎麼最終修復它? – DasDas 2015-05-18 14:20:45

回答

2

從您的意見,我會得出這樣的結論有效性規則不返回錯誤,因此錯誤事件不會觸發。嘗試使用調試器逐步驗證方法。

此外,驗證是僅在源極 - 更新進行,在通常發生在LostFocus文本框。

編輯:MyNames是一個集合,它不能讓你嘗試綁定到,應該有約束力的錯誤在輸出窗口的屬性。

如果你希望綁定到你需要的路徑更改爲類似[0].LastName最後名稱結合的第一要素。

+0

當我向我的StringValidator類的Validate方法插入一個斷點時,斷點永遠不會到達 – Florian 2011-05-03 09:18:05

+1

驗證只在源更新文本框通常發生在'LostFocus'。你編輯了文本框並點擊了其他地方嗎? – 2011-05-03 09:29:25

+0

是的,我填充名爲「TextBox1」和「TextBox2」的2個文本框的.Text屬性然後我點擊名爲「Button3」的按鈕 – Florian 2011-05-03 09:36:34

0

貴名類執行INotifyPropertyChanged?

在文件的代碼隱藏文件,你的DataContext設置爲this。暴露你Names對象作爲一個屬性那裏,看看是否可行。我不熟悉綁定到窗口中的靜態資源。

3

應用程序不能修改這個集合的內容。有關如何使用此附加屬性的示例,請參閱示例部分。

WPF數據綁定模型使您可以將ValidationRules與您的Binding對象相關聯。在轉換器被調用之前進行綁定目標到源綁定源值傳輸期間進行驗證。以下描述驗證過程:

1.當一個值從目標屬性傳輸到源屬性時,數據綁定引擎首先刪除任何可能已添加到Validation.Errors附加屬性的ValidationError綁定元素。然後它檢查是否爲該綁定定義了任何自定義的ValidationRules,在這種情況下,它會在每個ValidationRules上調用Validate方法,直到其中一個出現錯誤或者直到所有這些錯誤都通過。

2.一旦有自定義規則未通過,綁定引擎將創建一個ValidationError對象並將其添加到綁定元素的Validation.Errors集合中。驗證時。錯誤不是空的,元素的Validation.HasError附加屬性設置爲true。此外,如果Binding的NotifyOnValidationError屬性設置爲true,則綁定引擎會引發元素上的Validation.Error附加事件。

3.如果所有規則都通過,則綁定引擎會調用轉換器(如果存在)。

4.如果轉換器通過,綁定引擎會調用源屬性的setter。

5.如果綁定有與之關聯的ExceptionValidationRule,並且在步驟 4中引發異常,綁定引擎會檢查是否存在UpdateSourceExceptionFilter。您可以選擇使用UpdateSourceExceptionFilter回調來提供處理異常的自定義處理程序。如果未在綁定中指定UpdateSourceExceptionFilter,則綁定引擎會創建帶有該異常的ValidationError,並將其添加到綁定元素的Validation.Errors集合中。

另請注意,在任一方向(目標到源或源到目標)的有效值傳輸都會清除Validation.Errors附加屬性。

有關MultiBinding方案中此屬性的行爲的信息,請參閱ValidationError。