问题描述
我想显示使用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
希望这对以后的人有帮助