问题描述
认为我的绑定不在某个地方,我想将验证错误显示为datagrid中的工具提示。我将不胜感激,有人建议如何实现这一目标或指出我的错误
我的简单测试模型:
public class TimeSheets
{
public int Id { get; set; }
public double MondayTime { get; set; }
}
视图:
public class TimeSheets
{
public int Id { get; set; }
public double MondayTime { get; set; }
}
viewmodel:
public class DataGridviewmodel : Screen,IDataErrorInfo
{
private BindableCollection<TimeSheets> _times = new BindableCollection<TimeSheets>();
private readonly DataGridviewmodelValidator _dgVal;
public BindableCollection<TimeSheets> Times
{
get { return _times; }
set { _times = value;
NotifyOfPropertyChange(() => Times);
}
}
public DataGridviewmodel()
{
Times.Add(new TimeSheets { Id = 1,MondayTime = 3.5 });
_dgVal = new DataGridviewmodelValidator();
}
public string this[string columnName]
{
get
{
var firstOrDefault =_dgVal.Validate(this).Errors.FirstOrDefault(lol => lol.PropertyName == columnName);
if (firstOrDefault != null)
return _dgVal != null ? firstOrDefault.ErrorMessage : "";
return "";
}
}
public string Error
{
get
{
if (_dgVal != null)
{
FluentValidation.Results.ValidationResult results = _dgVal.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 class TimeSheetValidator:AbstractValidator<TimeSheets>
{
public TimeSheetValidator()
{
RuleFor(x => x.Id)
.Empty()
.WithMessage("Empty ID");
RuleFor(x => x.MondayTime)
.Empty()
.WithMessage("Time Empty");
RuleFor(x => x.MondayTime)
.Equal(3.5)
.WithMessage("Valildation");
}
}
来自viewmodel的ListValidation:
enter cod public class DataGridviewmodelValidator : AbstractValidator<DataGridviewmodel>
{
public DataGridviewmodelValidator()
{
RuleForEach(x => x.Times).SetValidator(new TimeSheetValidator());
}
}
解决方法
如果您的XAML看起来像
<DataGrid ToolTip="{Binding Error}">
......
</DataGrid>
初始化WPF组件时,将使用Errors属性值。如果要更新此内容,则必须为OnpropertyChanged
调用Error
委托以触发绑定刷新。应该这样做,因为您已经在Error.Get
中提供了数据。