gpt4 book ai didi

wpf - 如何使用 IDataErrorInfo 实现条件验证

转载 作者:行者123 更新时间:2023-12-03 10:42:38 25 4
gpt4 key购买 nike

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

实现了哪些验证:

  • 在应用程序启动时,会检查 BackupFolderPath 的存在。如果此路径不存在,应用程序将导航到设置页面并将控件边框标记为红色。
  • 如果用户在设置页面上并且 BackupFolderPath 存在。现在,如果我们尝试更改 BackupFolderPath,则验证再次出现,并使控件边框颜色为红色。

  • 我们现在要修改的内容:
  • 如果路径不存在,我们希望仅在应用程序启动时保持边框颜色为红色。对于第二种情况,如果路径存在但用户尝试从 UI 更改它,那么我们不想调用验证,这意味着文本框边框颜色不应更改为红色。我们希望允许用户在此处更改路径。

  • 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);
    }
    }

    最佳答案

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

    UpdateSourceTrigger=PropertyChanged

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

    也许您应该考虑使用文件选择器而不是文本框。

    关于wpf - 如何使用 IDataErrorInfo 实现条件验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49514905/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com