如何更正INotifyDataErrorInfo错误直到更正?

时间:2017-02-08 23:15:24

标签: c# wpf .net-4.5 validationattribute inotifydataerrorinfo

我的验证在第一个实例中有效,但是当我从一个Tab项目转到另一个Tab项目并再次返回时,验证就消失了。

我希望这个状态是持久的,直到用户在这种情况下输入有效的传递标准。

也许这是预期的行为,我在文档中遗漏了一些东西。

在我的应用程序中,我有一个 MainWindow.xaml ,一个 MainWindowViewModel.cs 作为其继承自 BaseViewModel.cs 的DataContext实现 INotifyPropertyChanged INotifyDataErrorInfo 。然后,我创建了一个名为 FilePath.cs 的自定义 ValidationAttribute

MainWindow.xaml包含一个带有两个Tab项的Tab Control。只有一个文本框我已经实现了我的验证。这是因为它在验证不正确时会通知我。在此示例中,文件路径不存在。

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

1 个答案:

答案 0 :(得分:0)

不确定你的情况,但你可以尝试一下,

TextBox with validation loses ErrorTemplate on tab change

不过,我不是下载者:)