2017-02-08 23 views
-1

我的驗證在第一個例子中起作用,但是當我從一個Tab項移動到另一個時,驗證消失。如何使INotifyDataErrorInfo錯誤持續到更正爲止?

我會期望這個狀態是持久性的,直到用戶在這種情況下輸入有效的傳遞條件。

也許這是預期的行爲,我錯過了文檔中的某些東西。

在我的應用程序有一個MainWindow.xamlMainWindowViewModel.cs作爲其的DataContext從一個BaseViewModel.cs實現INotifyPropertyChanged的,並INotifyDataErrorInfo繼承。然後,我創建了一個自定義ValidationAttribute,稱爲FilePath.cs

MainWindow.xaml由帶有兩個選項卡項的選項卡控件組成。只有一個文本框已經實現了我的驗證。這是在驗證不正確時通知我的意義上的。在這個例子中,文件路徑不存在。

MainWindow.xaml

<TabControl> 
     <TabItem Header="Boxs"> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition Height="Auto"/> 
        <RowDefinition Height="*"/> 
       </Grid.RowDefinitions> 

       <Grid.ColumnDefinitions> 
        <ColumnDefinition /> 
        <ColumnDefinition /> 
       </Grid.ColumnDefinitions> 

       <Label Grid.Column="0" 
         Grid.Row="0" 
         Content="File Path" /> 
       <TextBox Grid.Column="1" 
         Grid.Row="0" 
         Margin="5,5,5,5" 
         Text="{Binding FilePath, 
             Mode=TwoWay, 
             NotifyOnValidationError=True, 
             ValidatesOnNotifyDataErrors=True, 
             UpdateSourceTrigger=PropertyChanged}" /> 
      </Grid> 
     </TabItem> 
     <TabItem Header="Blank"/> 
    </TabControl> 

MainViewModel.cs

public class MainWindowViewModel : BaseViewModel 
{ 
    private string filePath; 

    [FilePath] 
    public string FilePath 
    { 
     get { return filePath; } 
     set 
     { 
      filePath = value; 
      ValidateProperty(value); 
      NotifyPropertyChanged(FilePath); 
     } 
    } 
} 

FilePath.cs

public sealed class FilePath : ValidationAttribute 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     if (!Directory.Exists((string)value)) 
     { 
      return new ValidationResult("Requires Valid File Path", 
        new string[] { validationContext.MemberName }); 
     } 

     return ValidationResult.Success; 
    } 
} 

回答