未引发 Collection Changed 事件中的 Errors Changed

问题描述

我的 VM 中有这样的完整属性

public ObservableCollection<ServiceHost> ServiceHosts
{
    get => serviceHosts;
    set
    {
        if (serviceHosts == value) { return; }
        serviceHosts = value;
        OnPropertyChanged();
    }
}

在我的 MainWindow 的另一个 viewmodel 中,我使用 ServiceHosts 属性上的 CollectionChanged 事件来获取添加的项目,将其转换为我预期的类型并侦听 ErrorsChanged 事件该类型的属性
看起来像这样:

ServiceHostviewmodel.ServiceHosts.CollectionChanged += ServiceHostsOnCollectionChanged;

private void ServiceHostsOnCollectionChanged(object sender,NotifyCollectionChangedEventArgs e)
{
    if (e.Action == NotifyCollectionChangedAction.Add)
    {
        if (e.NewItems[0] is ServiceHost newItems)
        {
            newItems.Validator = new ServiceHostValidator();
            newItems.ErrorsChanged += (o,args) => UpdateallErrors();
            newServiceHost.ValidateallProperties();

        }
    }
}

不幸的是,ErrorsChanged 事件从未触发 UpdateallErrors 方法,即使单元格显示红色边框,此事件也不会执行,我不知道为什么。
这是一个工作示例,我也使用 ErrorsChanged 事件,但在这里我将数据从代码而不是 UI 添加ServiceHosts

private void SetErrorsChangedEventToAllServiceHosts(XmlParserBase xmlParserBase)
{
    foreach (var serviceHost in xmlParserBase.GetServiceHostClients(new ServiceHostValidator()))
    {
        ServiceHostviewmodel.ServiceHosts.Add(serviceHost);
        serviceHost.ErrorsChanged += (sender,args) => UpdateallErrors();
    }
}

为什么 ServiceHostsOnCollectionChanged 中的 ErrorsChanged 事件不起作用?
任何帮助表示赞赏。

评论更新: 这是我的模型类中的一些代码

public class ServiceHost : INotifyDataErrorInfo
{
    public IValidator<ServiceHost> Validator;

    public ServiceHost(IValidator<ServiceHost> validator)
    {
        this.Validator = validator;
        this.Validator.ErrorsChanged += (s,e) => OnErrorsChanged(e);
    }
}

解决方法

不幸的是,ErrorsChanged 事件从未触发 UpdateAllErrors 方法,即使单元格显示红色边框,此事件也不会执行,我不知道为什么。

由实现 INotifyDataErrorInfo 接口的类来显式引发 ErrorsChanged 事件

只要单元格显示红色边框,它就不会被框架引发。例如,红色边框可能意味着甚至无法设置源属性。例如,您不能将 T 类型的属性设置为 T 实例以外的任何其他值。

,

我刚刚找到了一个可行的解决方案。就像我在@mm8 的评论中提到的那样,我发现这段代码:

Validator.ErrorsChanged += (s,e) => OnErrorsChanged(e);

它在我的构造函数中,从未被调用,因为通过使用 e.NewItems[0] is ServiceHost newServiceHost 检查我的运行时类型,我没有创建新实例,因此没有调用构造函数。我尝试将该部分移到构造函数外部和 ValidateAllProperties 方法内部,现在工作正常。

在我的例子中,这个方法在我从 MainWindow VM 订阅 ErrorsChanged 属性后立即被调用。

newServiceHost.ErrorsChanged += (o,args) => UpdateAllErrors();

如果您有任何假设或更好的想法,请告诉我。