C# 为什么我的UI验证不起作用,但HasErros是真的?

C# 为什么我的UI验证不起作用,但HasErros是真的?,c#,.net,wpf,xaml,binding,C#,.net,Wpf,Xaml,Binding,我已经实现了INotifyDataErrorInfo。但它并没有真正起作用。 我用消息框检查了HasError,结果显示为true。 因此,我的错误被添加。但是UI没有实现我的XAML错误模板 ErrorsViewModel: public class ErrorsViewModel : INotifyDataErrorInfo { private readonly Dictionary<string, List<string>> _pro

我已经实现了INotifyDataErrorInfo。但它并没有真正起作用。 我用消息框检查了HasError,结果显示为true。 因此,我的错误被添加。但是UI没有实现我的XAML错误模板

ErrorsViewModel:

    public class ErrorsViewModel : INotifyDataErrorInfo
    {
        private readonly Dictionary<string, List<string>> _propertyErrors = new Dictionary<string, List<string>>();

        public bool HasErrors => _propertyErrors.Any();

        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

        public IEnumerable GetErrors(string propertyName)
        {
            return _propertyErrors.GetValueOrDefault(propertyName, null);
        }

        public void AddError(string propertyName, string errorMessage)
        {
            if (!_propertyErrors.ContainsKey(propertyName))
            {
                _propertyErrors.Add(propertyName, new List<string>());
            }

            _propertyErrors[propertyName].Add(errorMessage);
            OnErrorsChanged(propertyName);
        }

        public void ClearErrors(string propertyName)
        {
            if (_propertyErrors.Remove(propertyName))
            {
                OnErrorsChanged(propertyName);
            }
        }

        private void OnErrorsChanged(string propertyName)
        {
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
        }
    }
}
    public class KundeViewModel : ObservableObject, INotifyDataErrorInfo
    {
        private readonly ErrorsViewModel _errorsViewModel;
        private Kunde _skunde;
        public MatchCode matchCode;
        public Kunde Skunde
        {
            get { return _skunde; }
            set
            {

                OnPropertyChanged(ref _skunde, value);

                _errorsViewModel.ClearErrors(nameof(Skunde.Kundennr));
                MessageBox.Show(Skunde.Kundennr.ToString());
                if (_skunde.Kundennr < 200000)
                {
                    MessageBox.Show("Servus");
                    _errorsViewModel.AddError(nameof(Skunde.Kundennr), "Kundenummer muss 6 stellig sein.");
                }
                MessageBox.Show(HasErrors.ToString());

            }
        }
        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;


        public IEnumerable GetErrors(string propertyName)
        {
            return _errorsViewModel.GetErrors(propertyName);
        }
        private void ErrorsViewModel_ErrorsChanged(object sender, DataErrorsChangedEventArgs e)
        {
            ErrorsChanged?.Invoke(this, e);
            OnPropertyChanged(nameof(IsValid));
        }

        public bool IsValid => !HasErrors;
        public KundeViewModel()
        {
            _errorsViewModel = new ErrorsViewModel();
            _errorsViewModel.ErrorsChanged += ErrorsViewModel_ErrorsChanged;
            Skunde = new Kunde();
        }

        public bool HasErrors => _errorsViewModel.HasErrors;

    }
公共类错误viewmodel:INotifyDataErrorInfo
{
专用只读词典_propertyErrors=新词典();
public bool HasErrors=>\u propertyErrors.Any();
公共事件事件处理程序错误更改;
公共IEnumerable GetErrors(字符串propertyName)
{
返回_propertyErrors.GetValueOrDefault(propertyName,null);
}
public void AddError(字符串属性名称、字符串错误消息)
{
如果(!\u propertyErrors.ContainsKey(propertyName))
{
_Add(propertyName,newlist());
}
_propertyErrors[propertyName].Add(errorMessage);
OnErrorsChanged(财产名称);
}
公共无效ClearErrors(字符串propertyName)
{
如果(_propertyErrors.Remove(propertyName))
{
OnErrorsChanged(财产名称);
}
}
private void OnErrorsChanged(字符串属性名称)
{
ErrorsChanged?.Invoke(这是新的DataErrorsChangedEventArgs(propertyName));
}
}
}
如果Kunde.Kundennr少于6个字符,则应存在错误。messagebox显示它似乎可以工作。但验证不起作用

KundeViewModel:

    public class ErrorsViewModel : INotifyDataErrorInfo
    {
        private readonly Dictionary<string, List<string>> _propertyErrors = new Dictionary<string, List<string>>();

        public bool HasErrors => _propertyErrors.Any();

        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;

        public IEnumerable GetErrors(string propertyName)
        {
            return _propertyErrors.GetValueOrDefault(propertyName, null);
        }

        public void AddError(string propertyName, string errorMessage)
        {
            if (!_propertyErrors.ContainsKey(propertyName))
            {
                _propertyErrors.Add(propertyName, new List<string>());
            }

            _propertyErrors[propertyName].Add(errorMessage);
            OnErrorsChanged(propertyName);
        }

        public void ClearErrors(string propertyName)
        {
            if (_propertyErrors.Remove(propertyName))
            {
                OnErrorsChanged(propertyName);
            }
        }

        private void OnErrorsChanged(string propertyName)
        {
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
        }
    }
}
    public class KundeViewModel : ObservableObject, INotifyDataErrorInfo
    {
        private readonly ErrorsViewModel _errorsViewModel;
        private Kunde _skunde;
        public MatchCode matchCode;
        public Kunde Skunde
        {
            get { return _skunde; }
            set
            {

                OnPropertyChanged(ref _skunde, value);

                _errorsViewModel.ClearErrors(nameof(Skunde.Kundennr));
                MessageBox.Show(Skunde.Kundennr.ToString());
                if (_skunde.Kundennr < 200000)
                {
                    MessageBox.Show("Servus");
                    _errorsViewModel.AddError(nameof(Skunde.Kundennr), "Kundenummer muss 6 stellig sein.");
                }
                MessageBox.Show(HasErrors.ToString());

            }
        }
        public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;


        public IEnumerable GetErrors(string propertyName)
        {
            return _errorsViewModel.GetErrors(propertyName);
        }
        private void ErrorsViewModel_ErrorsChanged(object sender, DataErrorsChangedEventArgs e)
        {
            ErrorsChanged?.Invoke(this, e);
            OnPropertyChanged(nameof(IsValid));
        }

        public bool IsValid => !HasErrors;
        public KundeViewModel()
        {
            _errorsViewModel = new ErrorsViewModel();
            _errorsViewModel.ErrorsChanged += ErrorsViewModel_ErrorsChanged;
            Skunde = new Kunde();
        }

        public bool HasErrors => _errorsViewModel.HasErrors;

    }
公共类KundeViewModel:observeObject,INotifyDataErrorInfo
{
私有只读错误viewmodel\u错误iewmodel;
私人Kunde_skunde;
公共匹配码匹配码;
公共昆德斯肯德酒店
{
获取{return\u skunde;}
设置
{
OnPropertyChanged(参考skunde,价值);
_errorsViewModel.ClearErrors(名称(Skunde.kundenr));
Show(Skunde.kundenr.ToString());
如果(_skunde.Kundennr<200000)
{
MessageBox.Show(“Servus”);
_errorsViewModel.ADERROR(名称(Skunde.Kundennr),“Kundenummer muss 6 stellig sein”);
}
Show(hasrerrors.ToString());
}
}
公共事件事件处理程序错误更改;
公共IEnumerable GetErrors(字符串propertyName)
{
返回_errorsViewModel.GetErrors(propertyName);
}
私有无效错误VIEWMODEL_ErrorsChanged(对象发送方,数据错误SCHANGEDVENTARGS e)
{
ErrorsChanged?调用(此,e);
OnPropertyChanged(nameof(IsValid));
}
公共bool IsValid=>!HasErrors;
公共设备模型()
{
_errorsViewModel=新的errorsViewModel();
_errorsViewModel.ErrorsChanged+=errorsViewModel\u ErrorsChanged;
Skunde=新昆德();
}
public bool hasrerrors=>\u errorsViewModel.hasrerrors;
}
XAML:



是否执行
Skunde.Kundennr
实现
RaisePropertyChanged
?它实现INotiyPropertyChanged,它在ObservableObject类中