如何使用IDataErrorInfo实现条件验证

时间:2018-03-27 13:57:41

标签: wpf mvvm idataerrorinfo

我的MVVM应用程序中有一个配置设置页面。其中一个字段(Property:BackupFolderPath)在这里有一个TextBox控件。我们已使用IDataErrorInfo对此控件进行了验证。验证基本上是检查此路径的存在。

已实施哪些验证:

  1. 在应用程序启动时,会检查BackupFolderPath是否存在。如果此路径不存在,则应用程序将导航到设置页面并将控件边框标记为红色。

  2. 如果用户在设置页面上并且BackupFolderPath存在。现在,如果我们尝试更改BackupFolderPath,则再次进行验证,并将控件边框颜色设置为红色。

  3. 我们现在要修改的内容:

    1. 如果路径不存在,我们希望仅在应用程序启动时保持边框颜色为红色。对于第二种情况,如果路径存在但用户尝试从UI更改该路径,那么我们不希望调用验证,这意味着文本框边框颜色不应更改为红色。我们希望允许用户在此处更改路径。
    2. XAML代码段:

      <UserControl.Resources>
       <!--—Error Template to change the default behaviour-->
              <ControlTemplate x:Key="ErrorTemplate">
                  <DockPanel LastChildFill="True">
                      <Border BorderBrush="Red" BorderThickness="1">
                          <AdornedElementPlaceholder />
                      </Border>
                  </DockPanel>
              </ControlTemplate>
              <!-- —To display tooltip with the error-->
              <Style TargetType="TextBox">
                  <Style.Triggers>
                      <Trigger Property="Validation.HasError" Value="true">
                          <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
                      </Trigger>
                  </Style.Triggers>
              </Style>
      </UserControl.Resources>
      
      <TextBox x:Name="txtBackupFilePath" Text="{Binding Path=BackupFolderPath,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True,ValidatesOnExceptions=True,NotifyOnValidationError=True}"  Validation.ErrorTemplate="{StaticResource ErrorTemplate}"   Grid.Column="1" Grid.Row="4" Margin="0,0,155,0" Height="30" Width="500" TextWrapping="NoWrap" MaxLength="75" HorizontalAlignment="Left"/>
      

      ViewModel代码段:

       #region IDataErrorInfo Implementation
      
              public new string Error
              {
                  get { return null; }
              }
      
              public new string this[string columnName]
              {
                  get
                  {
                      string result = null;
                      switch (columnName)
                      {                        
                          case "BackupFolderPath":
                             if (!Directory.Exists(BackupFolderPath))
                                  result = "Configuration settings path: \'" + BackupFolderPath+ "\' not available !";
                              break;
                          default:
                              break;
                      }
      
                      return result;
                  }
              }
      
              #endregion
      
      private string _backupFolderPath = string.Empty;
              public string BackupFolderPath
              {
                  get { return _backupFolderPath ; }
                  set
                  {
                      if (_backupFolderPath == value) return;
      
                      _backupFolderPath = value; 
                      NotifyOfPropertyChange(() => BackupFolderPath);
                  }
              }
      

1 个答案:

答案 0 :(得分:0)

我最初很困惑,为什么在编辑路径时你会收到任何错误。 然后我注意到绑定的updatesourcetrigger。

UpdateSourceTrigger=PropertyChanged

当他们输入每个字母时,它正在进行检查。我看不出这是一个好计划。 如果你删除它,那么绑定将在失去焦点时传输,他们将输入整个路径。只有当它们放入无效路径时才会亮起。

也许你应该考虑使用filepicker而不是文本框。