wpf datagrid文本验证工具提示

问题描述

认为我的绑定不在某个地方,我想将验证错误显示为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中提供了数据。