使用caliburn micro和fluent验证通过按钮进行验证

问题描述

我想显示使用caliburn micro和FluentValidation对按钮事件的验证。验证规则当前按预期显示,但是直到单击按钮,我才能隐藏它们。对Wpf来说还很陌生,所以请保持简单。我试图绑定ValidatesOnDataErrors,但是无法绑定。此外,我试图隐藏显示错误的ControlTemplate

我的观点

<UserControl.Resources>
    <BooleanToVisibilityConverter x:Key="booleanVisibilityConverter"/>
</UserControl.Resources>

<Canvas FocusManager.FocusedElement="{Binding ElementName=Box}">
    <!-- Sets the focus to start with textBox-->
    <Button x:Name="ValidateText" Content="Validate" Canvas.Left="234" Canvas.Top="265" Width="301" Height="29" />

    <TextBox  Height="23" Canvas.Left="205" textwrapping="Wrap" Text="{Binding Name,UpdateSourceTrigger=PropertyChanged,ValidatesOnDataErrors=True}" 
              Canvas.Top="187" Width="330" TabIndex="0" x:Name="Box" >
        <Validation.ErrorTemplate >
            <ControlTemplate >
                <StackPanel Orientation="Horizontal" >
                    <!-- Placeholder for the TextBox itself -->
                    <AdornedElementPlaceholder x:Name="textBox" />
                    <TextBlock Margin="10" Text="{Binding [0].ErrorContent}" Foreground="Red"  />
                </StackPanel>
            </ControlTemplate>
        </Validation.ErrorTemplate>
    </TextBox>
</Canvas>

验证:

 public class UserValidator : AbstractValidator<Testviewmodel>
    {
        public UserValidator()
        {
            RuleFor(x => x.Name)
                .NotEmpty()
                .WithMessage("No name entered");
        }
    }

viewmodel:

    public class Testviewmodel : Screen,IDataErrorInfo

    {
        public bool Hello { get; set; } = false;

        private readonly UserValidator _userValidator;
        private bool _showHideError = false;

        public bool ShowHideError
        {
            get { return _showHideError; }
            set { _showHideError = value;
                NotifyOfPropertyChange(() => ShowHideError);
            }
        }

        public Testviewmodel()
        {
            _userValidator = new UserValidator();
        }

        public string Name { get; set; }
        private string _lastName;

        public string LastName
        {
            get { return _lastName; }
            set
            {
                _lastName = value;
                NotifyOfPropertyChange(() => LastName);
            }
        }

        public string this[string columnName]
        {
            get
            {
                var firstOrDefault = _userValidator.Validate(this).Errors.FirstOrDefault(lol => lol.PropertyName == columnName);
                if (firstOrDefault != null)
                    return _userValidator != null ? firstOrDefault.ErrorMessage : "";
                return "";
            }
        }
        public string Error
        {
            get
            {
                if (_userValidator != null)
                {
                    FluentValidation.Results.ValidationResult results = _userValidator.Validate(this);
                    if (results != null && results.Errors.Any())
                    {
                        string errors = string.Join(Environment.NewLine,results.Errors.Select(x => x.ErrorMessage).ToArray());
                        return errors;
                    }
                }
                return string.Empty;
            }
        }
        public void ValidateText()
        {
            //display Error on View when this is fired
        }
    }
}

解决方法

想通了!我创建了一个名为Validation的标志,并在加载HomepageViewModel时将其设置为false。然后在以下代码中检查验证是否正确:

    public string this[string columnName]
    {
        get
        {
            if (!Validation)
            {
                return null;
            }
            var firstOrDefault = _userValidator.Validate(this).Errors.FirstOrDefault(lol => lol.PropertyName == columnName);
            if (firstOrDefault != null)
                return _userValidator != null ? firstOrDefault.ErrorMessage : "";
            return "";
        }
    }
    public string Error
    {
        get
        {
            if (Validation)
            {

                if (_userValidator != null)
                {
                    FluentValidation.Results.ValidationResult results = _userValidator.Validate(this);
                    if (results != null && results.Errors.Any())
                    {
                        string errors = string.Join(Environment.NewLine,results.Errors.Select(x => x.ErrorMessage).ToArray());
                        return errors;
                    }
                } 
            }
            return string.Empty;
        }

当调用button方法时,我将flag(validation)设置为true并通知属性更改以按如下方式更新视图:

        Validation = true; // turn on validation
        NotifyOfPropertyChange(null); //refresh the properties/view

工作示例位于: https://github.com/zenloki/TestButtonValidation

希望这对以后的人有帮助

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...